咱們在請求網絡的時候都是使用各類框架,或者是 Android SDK 爲咱們提供的網絡請求類。可是你知不知道原始的網絡請求包是什麼樣的呢?或許你說這有什麼做用,我會使用框架就行了。很顯然,這種想法是有問題的。一些網絡請求的基本知識咱們仍是須要掌握的。這對咱們更深刻的開發和掌握更深的技術是很是有必要的。php
關於 HTTP 請求報文和響應報文的格式這裏就再也不過多介紹了,簡單說,HTTP 協議是以 ASCII 碼傳輸,創建在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分爲三個部分:請求行、請求頭、請求體。相似於:java
<空格> <協議版本號> <回車> <換行符>json
<請求頭>服務器
<請求體>網絡
其中協議規定了 POST 提交的數據必須放在請求體內,可是並無規定,請求體內提交的數據要用什麼編碼方式,這個是由開發者來本身來決定的。可是雖然咱們能夠本身來決定什麼編碼方式,可是數據發送出去,仍是要服務器解析的。通常的開發語言,好比:php、Python、java 等等,他們的網絡有關的 API 都內置了自動解析常見的數據類型。這個類型放在了請求頭中的 Content-Type
中。根據這個字段咱們就能夠獲取請求體的編碼方式了。前面說了這個編碼方式咱們是能夠本身定義的。可是爲了規範,而且開發語言內置了請求體的編碼方式。因此咱們仍是要根據規範和開發語言的需求來。app
下面來介紹經常使用的請求頭的編碼方式框架
application/x-www-form-urlencodedpost
這種方式是 POST 請求中提交數據最多見的方式了。其中 Volley 框架就是默認使用的這種編碼方式。其實不單單是 Volley 框架,通常的網絡請求若是沒有特別設置的話都是採用了這種編碼方式,採用這種編碼方式的 HTTP 請求報文是這樣的(這裏只是簡單的寫了一下)大數據
POST /xxx/xxx HTTP/1.1 // 請求行
// 請求頭
Host: 192.168.1.111:8080
Content-Type: application/x-www-form-urlencoded // 表示了請求體採用哪一種編碼方式
Cache-Control: no-cache
//請求體
x_coord=11&y_coord=2&z_coord=1
複製代碼
能夠看到請求參數在請求體中的體現是:x_coord=11&y_coord=2&z_coord=1,簡單的解釋一下上面的請求報文。編碼
form-data
form-data
又是一種新的編碼方式,它的請求報文爲
POST /xxx/xxx HTTP/1.1 // 請求行
// 請求頭
Host: 192.168.1.111:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="x_coord"
11111
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="y_coord"
111
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="z_coord"
11111
------WebKitFormBoundary7MA4YWxkTrZu0gW--
複製代碼
上面這個就是編碼格式爲 form-data
的時候的請求報文的樣子。相比 x-www-form-urlencoded
來講仍是有點複雜。這種請求方式,會生成一個 boundary 界限來分隔請求參數。這種請求方式支持上傳文件。通常須要上傳文件的時候使用這種格式的編碼方式,別的狀況下,它相比別的編碼方式缺點很明顯,構造請求體的時候太複雜。須要你手動把構造體拼接成上面構造體的樣式,服務器端纔會接收到。其中 Volley 請求框架就沒有封裝這種編碼方式的請求體,這也就說明了,爲何官方介紹 Volley 的時候說明,Volley 不支持 post 大數據,不適合上傳文件了。若是你非要使用 Volley 的話那也能夠,那你就本身定義一個 Request 重寫 getBodyContentType
方法和 getBody
方法就能夠了。這裏就不介紹這一部分了,不是咱們這裏的重點。提示一下,能夠仿照 Request 類
這裏根據請求包中的編碼方式修改一下。
而後 getBody
方法內修改一下請求體格式
application/json
這種請求體的編碼方式也是很常見的。先看看請求報文
POST /xxx/xxx HTTP/1.1
Host: 192.168.1.111:8080
Content-Type: application/json
Cache-Control: no-cache
{"x_coord":11,"y_coord":22,"z_coord":33}
複製代碼
能夠看到請求體的內容就是json
格式的。其中這種請求方式,Volley 爲咱們提供了 JsonObjectRequest 來實現。看看源碼就知道了。很簡單
這就是三種最多見的,也是咱們須要掌握的 POST 請求方式。固然請求體還有不少其餘類型的編碼格式,都不常見,就不介紹了!