關于WebApi接收值的情況

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


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

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

raw的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

raw的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更新

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,881評論 18 139
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,123評論 6 13
  • 原文鏈接:http://www.lxweimin.com/p/80e25cb1d81a HTTP簡介 HTTP協議是...
    懸筆e絕閱讀 471評論 0 0
  • HTTP簡介 HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用...
    加油小杜閱讀 594評論 1 3
  • “做表達這件事,是要去改變現在被說是美的東西。改的話,就要變身壞人,不扮壞人改不了。我的問題是,明明一直是扮演壞人...
    柯燃閱讀 221評論 0 0