1. 程式人生 > >Android 網路請求原理以及原始資料包

Android 網路請求原理以及原始資料包

我們在請求網路的時候都是使用各種框架,或者是 Android SDK 為我們提供的網路請求類。但是你知不知道原始的網路請求包是什麼樣的呢?或許你說這有什麼作用,我會使用框架就好了。很顯然,這種想法是有問題的。一些網路請求的基本知識我們還是需要掌握的。這對我們更深入的開發和掌握更深的技術是非常有必要的。

關於 HTTP 請求報文和響應報文的格式這裡就不再過多介紹了,簡單說,HTTP 協議是以 ASCII 碼傳輸,建立在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分為三個部分:請求行、請求頭、請求體。類似於:

<空格> <協議版本號> <回車> <換行符>

<請求頭>

<請求體>

其中協議規定了 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 請求方式。當然請求體還有很多其他型別的編碼格式,都不常見,就不介紹了!