天天看點

HttpRequest中的ContentType一.概況二.Content-type三.Content-type選擇

一.概況

我們知道app開發中用到網絡請求的部分絕大多數都是http或者https,在開發過程中要想要正确從服務端擷取資料我們就要嚴格遵守http協定。我們開發中絕大部分使用的是get和post請求,在get請求時候如果拼接字段中有中文就要注意編碼問題(可能出現亂碼)參考get請求時候參數中含有“中文”字段出現亂碼問題的原因和解決方法;如果使用post請求,那麼要和背景協商好requestBody中content-type,這裡記錄一下content-type相關的。

二.Content-type

HTTP 協定是以 ASCII 碼傳輸,建立在 TCP/IP 協定之上的應用層規範。規範把 HTTP 請求分為三個部分:狀态行、請求頭、消息主體。

HTTP協定規定POST送出資料必須放在消息體中,但是沒有規定資料必須要使用什麼編碼方式。事實上,開發這可以自己決定消息主題的格式,隻要滿足HTTP協定要求的格式就行。

但是,資料不光要能發送出去,還要服務端能過正确接受解析,一般在服務端例如java,php等語言都内置了自動解析常見資料結構格式的功能。一般是根據請求頭中Content-type字段來擷取消息體的編碼方式,然後對消息體進行解析。是以POST送出資料,包含Content-type和消息體資料。

三.Content-type選擇

3.1 application/x-www-form-urlencoded

常見的 POST 送出資料的方式,浏覽器的原生form表單。例如我們在使用okhttp的時候用的FormEncodingBuilder(2.7.0版本中)。FormEncodingBuilder裡面預設使用的就是application/x-www-form-urlencoded,如下

public final class FormEncodingBuilder {
	  private static final MediaType CONTENT_TYPE =
	      MediaType.parse("application/x-www-form-urlencoded");
	--------代碼省略---------
	  public RequestBody build() {
	    return RequestBody.create(CONTENT_TYPE, content.snapshot());
	  }
}
           

3.2 multipart/form-data

常見的 POST 資料送出的方式,我們使用表單上傳檔案時使用。可以用來上傳檔案用。例如我們在使用okhttp的時候用的MultipartBuilder。使用例子如下(這裡不贅述添加檔案的過程,隻展示設定content-type)

MultipartBuilder builder = new MultipartBuilder() .type(MultipartBuilder.FORM);
           

裡面的MultipartBuilder.FORM源碼如下

public static final MediaType FORM = MediaType.parse("multipart/form-data");
           

3.3 application/json

常見的 POST 送出資料的方式,application/json 這個 Content-Type 作為響應頭很常見,同時現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化後的 JSON 字元串也很常見了。JSON 格式支援比鍵值對複雜得多的結構化資料,這一點也很有用。使用如下(還是以okhttp為例子)

--------代碼省略---------
public static final MediaType JSON=MediaType.parse("application/json; charset=utf-8");
--------代碼省略---------
RequestBody requestBody = RequestBody.create(JSON, json);//json為要傳的json字元串
--------代碼省略---------
           

繼續閱讀