研究一下WebApi的接收值的情況
使用的WebApi的版本是5.2.3
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" />
序言
我們先來看看幾種post請求(使用工具postman)主要的就這4種
form-data
application/x-www-form-urlencoded
Text
application/json
No.1 form-data
他的請求報文:
POST /BFMWeb/api/Mobility/MarkRemindersAsRead HTTP/1.1
Host: localhost:80
Cache-Control: no-cache
Postman-Token: 12ad3f0f-9c53-c437-d9aa-2fb406a9c506
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
123
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="Id"
1
------WebKitFormBoundary7MA4YWxkTrZu0gW--
No.2 x-www-form-urlencoded
他的請求報文:
POST /BFMWeb/api/Mobility/MarkRemindersAsRead HTTP/1.1
Host: localhost:80
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: 851ae059-6e8c-1c3c-10e1-e361c17dbc4d
name=123
No.3 Text
他的請求報文:
POST /BFMWeb/api/Mobility/MarkRemindersAsRead HTTP/1.1
Host: localhost:80
Cache-Control: no-cache
Postman-Token: 8238404f-efa8-4abf-c91a-88d0f3b96efe
123
No.4 application/json
他的請求報文:
POST /BFMWeb/api/Mobility/MarkRemindersAsRead HTTP/1.1
Host: localhost:80
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 7f57b617-73b4-c644-3d2e-9f19df1f0492
{
"name":"123"
}
廢話太多,直接正文
GET
一、GET,接收一個基礎類型
[HttpGet]
public dynamic GetAcceptedString(string request)
{
return new { request };
}
只能url,直接來 http://localhost:65084/api/AcceptedValue/GetAcceptedString?request=hello
接收到request的值就是hello
二、GET,接收多個基礎類型
[HttpGet]
public dynamic GetAcceptedMulti(string requset, int num)
{
return new { requset, num };
}
url,直接來http://localhost:65084/api/AcceptedValue/GetAcceptedMulti?requset=hello&num=1
接收到request的值就是hello,num的值是1
三、GET,接收一個對象
[HttpGet]
public dynamic GetAcceptedObject(GetAcceptedObjectRequest requset)//接收不到
{
return requset;
}
[HttpGet]
public dynamic GetAcceptedObject([FromUri]GetAcceptedObjectRequest requset)
{
return requset;
}
發現上面不寫[FromUri]的話,我們可以進Action,但是接收的總是null的值。所以只能使用[FromUri]這個方式
并且這種方式一定要這樣調用/GetAcceptedObject?request.name=hello&request.id=1
來區分不同參數
四、GET,接收多個對象
[HttpGet]
public dynamic GetAcceptedMultiObject([FromUri]PostAcceptedObjectRequest request,[FromUri]GetAcceptedObjectRequest a)
{
return new { request, a };
}
/GetAcceptedMultiObject?request.name=1&request.id=1&request.isbool=true&a.name=1&a.id=1
這里也是要用[FromUri],不然甚至會直接出返回error信息,提示綁定時錯誤,區分不了兩個過來的參數
五、GET,接收基礎類型和對象
[HttpGet]
public dynamic GetAcceptedStringAndObject(string name, [FromUri]GetAcceptedObjectRequest request)
{
return new { name, request };
}
對象還是需要加上[FromUri],不寫單個對象就是接收不到,多個對象直接返回error,區分不了兩個過來的參數
POST
一、POST,接收一個基礎類型
[HttpPost]
public dynamic PostAcceptedStringFromBody([FromBody]string request)
{
return new { request };
}
[HttpPost]
public dynamic PostAcceptedString(string request)
{
return new { request };
}
發現如果不使用 [FromBody] 的話,在body里無論用那種方式都接收不到,只能拼地址欄
就是:/PostAcceptedString?request=1
一般不推薦,我們POST就是為了能在body里傳東西
來看看使用 [FromBody]
WebApi 中如果只接收一個基礎類型參數,不能指定key的名稱(后來我想想和前面raw的application一樣的,這個相當于application/x-www-form-urlencoded)
二、POST,多個基礎類型
如果使用了兩個基礎類型,那就接收不到了。因為一個Action中只能有一個[FromBody]標識。
當然,如果你不想定義類,可以使用Newtonsoft.Json.Linq的JObject json對象容器接收參數。
[HttpPost]
public dynamic PostAcceptedJObject(JObject request)
{
var name = request["name"];
var age = request["age"];
return new { name, age };
}
三、POST,接收一個對象
[HttpPost]
public dynamic PostAcceptedObject(PostAcceptedObjectRequest request)
{
return request;
}
使用application/json這種方式POST
成功的接收到了值
四、POST,接收多個對象
發現body里是不行的。只能選擇和上面GET的方式一樣,url中傳值,參數需要加上[FromUri]
[HttpPost]
public dynamic PostAcceptedMultiObject([FromUri]PostAcceptedObjectRequest request, [FromUri]GetAcceptedObjectRequest a)
{
return new { request, a };
}
五、POST,接收基礎類型和對象
[HttpPost]
public dynamic PostAcceptedStringAndObject(string name, PostAcceptedObjectRequest requset)
{
return new { name, requset };
}
只能基礎類型放url,對象放body
總結一下
GET:只能通過url傳值,如果要接收對象,就得加上[FromUri]
POST:只能接收一個基礎類型,通過[FromBody]聲明,不然只能還是url來接收。多個對象也不能在body里傳需要用url并聲明[FromUri]來接收
結語
--
有空再更新。
2017/9/11更新