研究一下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更新