說到網路,就不得不先說一下HTTP,
HTTP的概念、原理、作業機制、資料格式
HTTP的定義
一種網路傳輸協議,位于TCP /IP協議族的最頂層——應用層
HTTP
HypertextTransferProtocol,超文本傳輸協議,和HTML(HypertextMarkupLanguage超文本標記語言)一起誕生,用于在網路上請求和傳輸HTML內容,超文本,即「擴展型文本」,指的是HTML中可以有鏈向別的文本的鏈接(hyperlink),

HTTP 的作業方式
瀏覽?:
用戶輸入地址后回車或點擊鏈接 -> 瀏覽?拼裝 HTTP 報文并發送請求給服務? -> 服務?處理請求后發送回應報文給瀏覽? -> 瀏覽?決議回應報文并使用渲染引擎顯示到界面
手機 App:
用戶點擊或界面自動觸發聯網需求 -> Android 代碼呼叫拼裝 HTTP 報文并發送請求到服務? -> 服務?處理請求后發送回應報文給手機 -> Android 代碼處理回應報文并作出相應處理(如儲存資料、加工資料、顯示資料到界面)
URL 和 HTTP 報文
URL 格式
三部分:協議型別、服務?地址(和埠號)、路徑(Path) 協議型別://服務?地址[:埠號]路徑http://hencoder.com/users?gender=male
報文格式
請求報文

回應報文

冪等 (idempotent、idempotence)是一個數學或計算機學概念,常見于抽象代數中,
冪等有以下幾種定義:
對于單目運算,如果一個運算對于在范圍內的所有的一個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那么我們就稱該運算是冪等的,比如絕對值運算就是一個例子,在實數集中,有abs(a) =abs(abs(a)) ,
對于雙目運算,則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函式,有在在實數集中冪等,即max(x,x) = x
Request Method 請求方法
GET(冪等)
用于獲取資源,無需body
GET /users/1 HTTP/1.1
Host: api.github.com
對應 Retro?t 的代碼:
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);POST
POST(不冪等)
用于增加或修改資源
發送給服務?的內容寫在 Body 里面
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded Content-Length: 13
name=xxx&gender=male
發送給服務器的內容寫在body里面
對應 Retro?t 的代碼:
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
PUT(冪等)
用于修改資源
發送給服務?的內容寫在 Body 里面
PUT /users/1 HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded Content-Length: 13
gender=male
對應 Retro?t 的代碼:
@FormUrlEncoded
@PUT("/users/{id}")
Call<User> updateGender(@Path("id") String id, @Field("gender") String gender);
DELETE(冪等)
用于洗掉資源
不用發送body
DELETE /users/1 HTTP/1.1
Host: api.github.com
對應 Retro?t 的代碼:
@DELETE("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);
HEAD(冪等)
和GET使用方法完全相同
和GET唯一的區別在于,回傳的回應中沒有body
Status Code 狀態碼
三位數字,用于對回應結果做出型別化描述(如「獲取成功」「內容未找到」),
1xx:臨時性訊息,如:100 (繼續發送)、101(正在切換協議)
2xx:成功,最典型的是 200(OK)、201(創建成功),
3xx:重定向,如 301(永久移動)、302(暫時移動)、304(內容未改變),
4xx:客戶端錯誤,如 400(客戶端請求錯誤)、401(認證失敗)、403(被禁止)、404(找不到內容),
5xx:服務?錯誤,如 500(服務?內部錯誤),
Header 首部
作用:HTTP 訊息的 metadata,
Host
目標主機,注意:不是在網路上用于尋址的,而是在目標服務?上用于定位子服務?的,
Content-Type
指定 Body 的型別,主要有四類:
1.text/html
請求 Web 頁面是回傳回應的型別,Body 中回傳 html 文本,格式如下:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 853
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
......
2.x-www-form-urlencoded(常用)
Web 頁面純文本表單的提交方式,

POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded Content-Length: 27
name=rengwuxian&gender=male
對應 Retro?t 的代碼:
@FormUrlEncoded @POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
3.multitype/form-data
Web 頁面含有二進制檔案時的提交方式,(如上傳檔案)
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MAsdkTrZu0gW Content-Length: 2352
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
xxx
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" Content-Type: image/jpeg
JFIFHHvOwX9jximQrWa......
------WebKitFormBoundary7MA4YWxkTrZu0gW--
對應 Retro?t 的代碼:
@Multipart
@POST("/users")
Call<User> addUser(@Part("name") RequestBody name, @Part("avatar") RequestBody avatar);
RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"),
nameStr);
RequestBody avatarPart = RequestBody.create(MediaType.parse("image/jpeg"), avatarFile);
api.addUser(namePart, avatarPart);
4.application/json , image/jpeg , application/zip ...
單項內容(文本或非文本都可以),用于 Web Api 的回應或者 POST / PUT 的請求
如在請求中提交 JSON
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8 Content-Length: 38
{"name":"xxx","gender":"male"}
對應 Retro?t 的代碼:
@POST("/users")
Call<User> addUser(@Body("user") User user);
...
// 需要使用 JSON 相關的 Converter
api.addUser(user);
Content-Length
指定 Body 的長度(位元組),
Transfer: chunked (分塊傳輸編碼 Chunked Transfer Encoding)
用于當回應發起時,內容長度還沒能確定的情況下,和 Content-Length 不同時使用,用途是盡早給出回應,減少用戶等待,
Location
指定重定向的目標 URL
User-Agent
用戶代理,即是誰實際發送請求、接受回應的,例如手機瀏覽?、某款手機 App,
Range / Accept-Range
Accept-Range: bytes:回應報文中出現,表示服務?支持按位元組來取范圍資料
Range: bytes=<start>-<end>:請求報文中出現,表示要取哪段資料
Content-Range:<start>-<end>/total:回應報文中出現,表示發送的是哪段資料
作用:斷點續傳、多執行緒下載
其他 Headers
Accept: 客戶端能接受的資料型別,如 text/html
Accept-Charset: 客戶端接受的字符集,如 utf-8
Accept-Encoding: 客戶端接受的壓縮編碼型別,如 gzip
Content-Encoding:壓縮型別,如 gzip
Cache
作用:在客戶端或中間網路節點快取資料,降低從服務?取資料的頻率,以提高網路性能,
RESTFUL
RESTFUL是一種網路應用程式的設計風格和開發方式,基于HTTP,可以使用XML格式定義或JSON格式定義,RESTFUL適用于移動互聯網廠商作為業務介面的場景,實作第三方OTT呼叫移動網路資源的功能,動作型別為新增、變更、洗掉所呼叫資源,
RESTFUL特點包括:
1、每一個URI代表1種資源;
2、客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來洗掉資源;
3、通過操作資源的表現形式來操作資源;
4、資源的表現形式是XML或者HTML;
5、客戶端與服務端之間的互動在請求之間是無狀態的,從客戶端到服務端的每個請求都必須包含理解請求所必需的資訊, [1]
這些內容是看了扔物線朱凱大神的課后,大神講的很詳細很通俗易懂,自己再做個總結與回顧
https://hencoder.ke.qq.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/295684.html
標籤:其他
