Android 網路請求原理以及原始資料包
Android 網路請求原理以及原始資料包
我們在請求網路的時候都是使用各種框架,或者是 Android SDK 為我們提供的網路請求類。但是你知不知道原始的網路請求包是什麼樣的呢?或許你說這有什麼作用,我會使用框架就好了。很顯然,這種想法是有問題的。一些網路請求的基本知識我們還是需要掌握的。這對我們更深入的開發和掌握更深的技術是非常有必要的。
關於 HTTP 請求報文和響應報文的格式這裡就不再過多介紹了,簡單說,HTTP 協議是以 ASCII 碼傳輸,建立在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分為三個部分:請求行、請求頭、請求體。類似於:
<metho> <URL> <空格> <協議版本號> <回車> <換行符> <請求頭> <請求體>
其中協議規定了 POST 提交的資料必須放在請求體內,但是並沒有規定,請求體內提交的資料要用什麼編碼方式,這個是由開發者來自己來決定的。但是雖然我們可以自己來決定什麼編碼方式,但是資料傳送出去,還是要伺服器解析的。一般的開發語言,比如:php、Python、java 等等,他們的網路有關的 API 都內建了自動解析常見的資料型別。這個型別放在了請求頭中的 Content-Type
中。根據這個欄位我們就可以獲取請求體的編碼方式了。前面說了這個編碼方式我們是可以自己定義的。但是為了規範,並且開發語言內建了請求體的編碼方式。所以我們還是要根據規範和開發語言的需求來。
下面來介紹常用的請求頭的編碼方式
application/x-www-form-urlencoded
這種方式是 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 類

getbodyContentType.jpg
這裡根據請求包中的編碼方式修改一下。
然後 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 請求方式。當然請求體還有很多其他型別的編碼格式,都不常見,就不介紹了!