環境:
- 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框架本身也不支持,不過只要你願意可以自己做箇中間件支持一下~~~