表單數據默認的提交方式是“application/x-www-form-urlencoded”。就是說,在發送到服務器之前,所有字符都會進行編碼(空格轉換爲 "+" 加號,特殊符號轉換爲 ASCII HEX 值)。
1、enctype屬性值
值 | 描述 |
---|---|
application/x-www-form-urlencoded | 在發送前編碼所有字符(默認) |
multipart/form-data |
不對字符編碼。 在使用包含文件上傳控件的表單時,必須使用該值。 |
text/plain | 空格轉換爲 "+" 加號,但不對特殊字符編碼。 |
我們知道,HTTP 協議是以 ASCII 碼傳輸,建立在 TCP/IP 協議之上的應用層規範。
規範把 HTTP 請求分爲三個部分:狀態行、請求頭、消息主體。類似於下面這樣:
BASH<method> <request-URL> <version>
<headers>
<entity-body>
服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。
1.1、application/x-www-form-urlencoded
這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 <form> 表單,如果不設置 enctype
屬性,那麼最終就會以 application/x-www-form-urlencoded 方式提交數據。
1.1.1、Spring中設置-@RequestParam
Spring
中用@RequestParam
來處理Content-Type
爲application/x-www-form-urlencoded
數據。修飾的對象可以是基本數據類型和自定義對象。
@RequestParam的原理是Spring
將Request.getParameter()
中的Key-Value
參數Map
轉化成了參數@RequestParam
修飾的基本類型數據或對象。
@RequestParam同時適用於get和post,只要Content-Type
爲application/x-www-form-urlencoded
。
1.2、multipart/form-data
這又是一個常見的 POST 數據提交的方式。我們使用表單上傳文件時,必須讓 <form> 表單的enctype 等於 multipart/form-data。
1.2.1、Spring中設置
可以使用@RequestPart
處理接收到的文件。
示例如下:
/**
* 單文件上傳
* @param file
* @param bucket
* @return
*/
@RequestMapping("uploadFile")
public JsonResult uploadFile(@RequestPart("file") MultipartFile file, @RequestParam String bucket){
String fileUrl = aliossService.uploadFile(file, bucket);
Map<String,String> result = new HashMap<>();
result.put("fileUrl",fileUrl);
return success(result);
}
1.3、application/json
application/json 這個 Content-Type 作爲響應頭大家肯定不陌生。實際上,現在越來越多的人把它作爲請求頭,用來告訴服務端消息主體是序列化後的 JSON 字符串。由於 JSON 規範的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什麼麻煩。
1.3.1、Spring中設置-@RequestBody
GET
請求中,因爲沒有HttpEntity
,所以@RequestBody
並不適用。POST
請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type
,SpringMVC
通過使用HandlerAdapter
配置的HttpMessageConverters
來解析HttpEntity
中的數據,然後綁定到@RequestBody修飾的對象上。- @RequestBody 也可以處理
application/xml
text/xml
我的博客之前提到過 XML-RPC(XML Remote Procedure Call)。它是一種使用 HTTP 作爲傳輸協議,XML 作爲編碼方式的遠程調用規範。
我的微信公衆號哦,掃碼關注我哦~