c#:從http請求報文看http協議中參數傳遞的幾種方式

環境:

  • vs2019 16.5.1
  • asp.net core 3.1.1
  • Postman v7.14.0

一、在url中傳遞數據

這種方式適用於get/post方法,也是一種最簡單、最直觀的參數傳遞方式,不過由於過於直觀(數據顯示在瀏覽器地址欄中),不建議使用此種方式傳遞敏感數據(傳遞中文的時候要在javascript端進行編碼 encodeURIComponent)。
http請求示例:

GET http://localhost:5000/Test/TestUrlPara?name=%E5%B0%8F%E6%98%8E&age=20 HTTP/1.1
User-Agent: PostmanRuntime/7.21.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 8f8c5745-1bd6-43da-8118-595b91fdb102
Host: localhost:5000
Accept-Encoding: gzip, deflate
Connection: keep-alive

上面傳遞的數據爲:name=小明,age=20
後臺接受方式:
webapi和webmvc相同

[HttpGet]
[HttpPost]
 public string TestUrlPara([FromQuery]string name, [FromQuery]int? age)
 {
     return $"hello:{name},你{age?.ToString()}歲了!";
 }

說明:[FromQuery]加不加都可以。

二、application/x-www-form-urlencoded

這是在post請求體裏面的一種編碼方式,要求http請求頭中:Content-Type: application/x-www-form-urlencoded,直接看http請求示例:
http請求示例:

POST http://localhost:5000/Test/TestPostFormUrlencoded HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: PostmanRuntime/7.21.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 96f83832-4878-4b16-b4e7-f152f8a6fc47
Host: localhost:5000
Accept-Encoding: gzip, deflate
Content-Length: 30
Connection: keep-alive

name=%E5%B0%8F%E6%98%8E&age=20

上面傳遞的數據:name=小明,age=20
後臺接受方式:
webapi:

[HttpPost]
public string TestPostFormUrlencoded([FromForm]string name, [FromForm]int? age)
{
   	return $"hello {name},你{age}歲了!";
}

注意:必須寫上[FromForm],否則獲取數據是null
webmvc
相比webapi,可以把[FromForm]去掉。

三、form-data

這是在post請求體裏面的一種編碼方式,要求http請求頭中:Content-Type: multipart/form-data; boundary=xxxxxxxxxxx,這種方式可以上傳文件,下面直接看http請求示例
http請求示例:

POST http://localhost:5000/Test/TestPostFormData HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------004374744169603298126403
User-Agent: PostmanRuntime/7.21.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 11083367-0fec-4938-9464-47e430f07281
Host: localhost:5000
Accept-Encoding: gzip, deflate
Content-Length: 442
Connection: keep-alive

----------------------------004374744169603298126403
Content-Disposition: form-data; name="name"

小明
----------------------------004374744169603298126403
Content-Disposition: form-data; name="age"

20
----------------------------004374744169603298126403
Content-Disposition: form-data; name=""; filename="testupload.db"
Content-Type: application/octet-stream

xiaoming
----------------------------004374744169603298126403--

上面請求傳遞參數:name=小明,age=20,上傳了一個文件testupload.db
後臺接受方式:
application/x-www-form-urlencoded方式,webapi和webmvc的異同點也是一樣的。

四、application/json

這是在post請求體裏面的一種編碼方式,要求http請求頭中:Content-Type: application/json,直接看http請求示例:
http請求示例:

POST http://localhost:5000/Test/TestBodyJson HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.21.0
Accept: */*
Cache-Control: no-cache
Postman-Token: bf664225-a214-4584-b5e2-8bead284d450
Host: localhost:5000
Accept-Encoding: gzip, deflate
Content-Length: 25
Connection: keep-alive

{"name":"小明","id":20}

後臺接受方式:
webapi

[ApiController]
[Route("[controller]/[action]")]
 public class TestController : ControllerBase
 {
     [HttpPost]
     public string TestBodyJson([FromBody]User user)
     {
         if (user == null) return "user is null.";
         return Newtonsoft.Json.JsonConvert.SerializeObject(user);
     }

 }
 public class User
 {
     public string name { get; set; }
     public int? id { get; set; }
 }

web-mvc:方式同webapi

五、總結

我們知道,在http協議報文裏傳遞的數據一般(也有很多在請求頭裏傳遞數據的,比如:jwt)都是放在url(get/post)裏或者是請求體裏(post)。

放在url裏傳遞參數最簡單、最直觀,但是安全性較低,還有傳遞中文的時候要在javascript進行一個編碼(encodeURIComponent("小明"))。

放在http請求體的參數一般要在http的請求頭裏表明請求體的數據格式(比如:Content-type:application/json表示請求體裏面是json字符串),當然你也可以不標明請求體的數據合適,不過你就得自己解析裏面的數據了。我們以asp.net core 3.1.1做爲後臺服務器,對這幾種的編碼方式做了測試,均能正常解析到參數值。

另外,我從postman中發現http的請求體裏的編碼方式還有很多,如下圖所示:
在這裏插入圖片描述
上面我標註出來的,都是我沒有測試的,估計aspnetcore框架本身也不支持,不過只要你願意可以自己做箇中間件支持一下~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章