ASP.NET WebAPI post引數傳遞
技術標籤:ASP.NET Web API
可行的傳參形式
- 鍵值對對應
dynamic
動態型別(非跨域)- 實體類
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();