HTTP中四種常見的 POST 提交數據方式

表單數據默認的提交方式是“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-Typeapplication/x-www-form-urlencoded數據。修飾的對象可以是基本數據類型和自定義對象。

@RequestParam的原理是SpringRequest.getParameter()中的Key-Value參數Map轉化成了參數@RequestParam修飾的基本類型數據或對象。

@RequestParam同時適用於get和post,只要Content-Typeapplication/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-TypeSpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,然後綁定到@RequestBody修飾的對象上。
  • @RequestBody 也可以處理 application/xml

text/xml

我的博客之前提到過 XML-RPC(XML Remote Procedure Call)。它是一種使用 HTTP 作爲傳輸協議,XML 作爲編碼方式的遠程調用規範。

我的微信公衆號哦,掃碼關注我哦~

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