1. 程式人生 > 其它 >ASP.NET WebAPI post引數傳遞

ASP.NET WebAPI post引數傳遞

技術標籤:ASP.NET Web API

可行的傳參形式

  1. 鍵值對對應
  2. dynamic動態型別(非跨域)
  3. 實體類
  4. JObject引數(推薦)

1.鍵值對對應

這裡所說的鍵值對並非是一般的鍵值對,是指鍵為空,值不為空的鍵值對
前臺請求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:"post",
    data: { '': "Amon"},
    success: function(a) {
        console.log(a);
    }
}); 	//12345678

後臺

在這裡插入圖片描述
可以看到後臺是接收到引數了的,但是這種方式只能傳一個鍵值對引數,{'': 'Amon', '': 'male'} 這種引數是接收不到的,當然也可以把所有引數序列化為字串,後臺再進行反序列化,但是這種方式較為繁瑣,所以不推薦

2.dynamic 動態型別(非跨域)

這種傳參方式在非跨域環境下可行,但是在跨域環境下,前臺請求時會出現 405 錯誤,雖然通過調整ajax請求引數會解決這個錯誤,但是後臺無法正常接收引數

前臺請求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:"post",
    contentType:
'application/json', data: JSON.stringify({ 'name': "Amon", sex: 'male'}), success: function(a) { console.log(a); } });

後臺
在這裡插入圖片描述
當前傳參方式在非跨域環境中測試為可以正常傳參,跨域環境暫未找到解決方法,如果有解決方法,歡迎交流

3.實體類

實體類是相對來說比較簡單的一種傳參方式,跟我們平常採用的傳參方式相似

前臺請求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:
"post", data: { 'name': "Amon", sex: 'male'}, success: function(a) { console.log(a); } });12345678

後臺

在這裡插入圖片描述
這種傳參方式需要宣告一個實體類,所以說在改變傳參時,相應的要去更改實體類,靈活性不是很高

4.JObject 引數(推薦)

JObject傳參方式是個人比較推薦的一種方式,前臺請求傳參寫法不具迷惑性,後臺接收也較為靈活

前臺請求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:"post",
    data: { 'name': "Amon", sex: 'male'},
    success: function(a) {
        console.log(a);
    }
});

後臺
在這裡插入圖片描述
如果有其他的傳參方式,歡迎交流


webapi 自宿主 post 多個引數

專案需要 java發起請求 呼叫c#客戶端的一個程式,而且要直接通過前臺ajax請求 ,不能通過java後臺訪問c#的介面服務。這樣就涉及到跨域問題,如果java後臺訪問就不涉及到跨域。查閱了很多資料,發現IE對跨域基本上限制要求比較小。在指令碼中設定一下跨域cors支援就可以。webapi通過後臺設定跨域支援。還有一個比較頭疼的問題就是傳參的問題。單一的字串,物件,或者多個引數 多個字元成員,多個物件也沒問題。關鍵是我這裡面對象巢狀物件。在解析的時候遇到很大的問題。最終還是解決了。如果單純的百度 肯定是永遠找不到解決的方式。最終還是通過了解了程式碼結構找到了解決的方法。直接上方法吧。

 $.ajax({
        type: "POST",
        url: "服務地址",
        data: { 物件1: json物件1, 物件2: json物件2 },
        success: function (data, status) {
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
        },
        complete: function () {
        }
    });

這種方式支援post 一次傳遞多個引數,如果用JsonStringfy 只能傳遞一個數據,這樣的弊端是,引數不明確。而且為了後臺轉換方便,你必須單獨New一個物件,這樣無疑既麻煩 又不明確。

這種方式後臺需要方法接收引數型別是 JObject型別。然後需要先序列化,再反序列化。注意:如果上面的data 你傳遞的是json物件,那麼需要你再一次序列化,再一次反序列化,直接拿到你想要的物件資料。

  var jsonobject = Newtonsoft.Json.JsonConvert.SerializeObject(引數1);

  var jsonpara = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonobject);
 
  var jsonborrow = Newtonsoft.Json.JsonConvert.SerializeObject(jsonpara.屬性1); 

  物件 bw = Newtonsoft.Json.JsonConvert.DeserializeObject<物件>(jsonborrow); 
  
  var jsonsignAuthority=Newtonsoft.Json.JsonConvert.SerializeObject(jsonpara.屬性2); 
  
  物件2 signAuthority = Newtonsoft.Json.JsonConvert.DeserializeObject<物件2>(jsonsignAuthority);

webapi自宿主的方式也挺簡單

var config = new HttpSelfHostConfiguration("http://localhost:" + System.Configuration.ConfigurationSettings.AppSettings["apiport"].ToString());
config.Routes.MapHttpRoute("default", "api/{controller}/{action}/{id}", new
{
    id = RouteParameter.Optional
});
var server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();