HTTP 的定義
一種網(wǎng)絡傳輸協(xié)議,位于 TCP / IP 協(xié)議族的最頂層——應用層
HTTP : Hypertext Transfer Protocol,超文本傳輸協(xié)議,和 HTML (Hypertext Markup Language 超文本標記語言) 一起誕生,用于在網(wǎng)絡上請求和傳輸 HTML 內容。
超文本,即「擴展型文本」,指的是 HTML 中可以有鏈向別的文本的鏈接(hyperlink)。
HTTP的工作方式

瀏覽?:
用戶輸入地址后回車或點擊鏈接 -> 瀏覽器?拼裝 HTTP 報文并發(fā)送請求給服務器? -> 服務器?處理理請求后發(fā)送響應報文給瀏覽器? -> 瀏覽器?解析響應報文并使用渲染引擎顯示到界?面
手機 App:
用戶點擊或界面自動觸發(fā)聯(lián)網(wǎng)需求 -> Android 代碼調用拼裝 HTTP 報文并發(fā)送請求到服務器? -> 服務器?處理理請求后發(fā)送響應報文給手機 -> Android 代碼處理理響應報文并作出相應處理理(如儲存數(shù)據(jù)、加工數(shù)據(jù)、顯示數(shù)據(jù)到界面)
URL和 http報文
-
URL
三部分:協(xié)議類型、服務器?地址(和端口號)、路徑(Path)
協(xié)議類型://服務器?地址[:端口號]路徑
http://hencoder.com/users?gender=male
URL.png
-
報文格式
-
Request 請求報文
Request報文格式.png
-
-
Response 響應報文
Response報文格式.png?
Request Method 請求方法
-
GET
用于獲取資源
對服務器?數(shù)據(jù)不進行修改
不發(fā)送 Body
格式:GET /users/1 HTTP/1.1 Host: api.github.com對應 Retrofit 的代碼:
@GET("/users/{id}") Call<User> getUser(@Path("id") String id, @Query("gender") String gender); -
POST
用于增加或修改資源
發(fā)送給服務器?的內容寫在 Body 里面
格式:POST /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded Content-Length: 13 name=rengwuxian&gender=male對應 Retrofit 的代碼:
@FormUrlEncoded @POST("/users") Call<User> addUser(@Field("name") String name, @Field("gender") String gender); -
PUT
用于修改資源
發(fā)送給服務器?的內容寫在 Body 里面
格式:PUT /users/1 HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded Content-Length: 13 gender=female對應 Retrofit 的代碼:
@FormUrlEncoded @PUT("/users/{id}") Call<User> updateGender(@Path("id") String id, @Field("gender") String gender); -
DELETE
用于刪除資源
不發(fā)送 Body
格式:DELETE /users/1 HTTP/1.1 Host: api.github.com對應 Retrofit 的代碼:
@DELETE("/users/{id}") Call<User> getUser(@Path("id") String id, @Query("gender") String gender); -
HEAD
和 GET 使用方法完全相同
和 GET 唯一區(qū)別在于,返回的響應中沒有 Body
GET和PUT是冪等的,無論請求或者修改多少次結果都是一樣的。DELETE也具有冪等性,刪除一次和刪除多次結果都是刪除了。
STATUS CODE 狀態(tài)碼 : 三位數(shù)字,用于對響應結果做出類型化描述(如獲取成功、內容未找到)
- 1xx:臨時性消息。如:100 (繼續(xù)發(fā)送)、101(正在切換協(xié)議)
- 2xx:成功。最典型的是 200(OK)、201(創(chuàng)建成功)。
- 3xx:重定向。如 301(永久移動)、302(暫時移動)、304(內容未改變)。
- 4xx:客戶端錯誤。如 400(客戶端請求錯誤)、401(認證失?。?03(被禁?止)、404(找
不不到內容)。
- 5xx:服務器?錯誤。如 500(服務器?內部錯誤)。
HEADER首部
作用:HTTP 消息的 metadata(元數(shù)據(jù)),metadata就是數(shù)據(jù)的數(shù)據(jù)或者數(shù)據(jù)的屬性
-
Host : 服務器主機地址,一般是域名 + tcp端口
注意:不是在網(wǎng)絡上用于尋址的,而是在目標服務器?上用于定位子服務器的。尋址是通過DNS系統(tǒng)來定位IP地址的
Content-Length : 指定 Body 的長度(字節(jié))
-
Content-Type : 指定 Body 的類型。主要有四類:
-
text/html : 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"> ...... -
x-www-form-urlencoded : Web 頁面純文本表單的提交方式。普通表單,encoded URL格式,只能傳文本,不能傳二進制數(shù)據(jù)
?
POST /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded Content-Length: 27 name=rengwuxian&gender=male對應Retrofit的代碼 :
@FormUrlEncoded @POST("/users") Call<User> addUser(@Field("name") String name, @Field("gender") String gender); -
multitype/form-data : 多部分形式,一般用于傳輸 Web 頁面含有二進制文件時的提交方式,如圖片、視頻等文件
POST /users HTTP/1.1 Host: hencoder.com Content-Type: multipart/form-data; boundary=---- WebKitFormBoundary7MA4YWxkTrZu0gW Content-Length: 2382 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="name" rengwuxian ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" Content-Type: image/jpeg JFIFHHvOwX9jximQrWa...... ------WebKitFormBoundary7MA4YWxkTrZu0gW--對應 Retrofit 的代碼:
@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); -
application/json : json形式,用于 Web Api 的響應或者 POST / PUT 的請求
請求中提交json
POST /users HTTP/1.1 Host: hencoder.com Content-Type: application/json; charset=utf-8 Content-Length: 38 {"name":"rengwuxian","gender":"male"}對應 Retrofit 的代碼:
@POST("/users") Call<User> addUser(@Body("user") User user); ... // 需要使?用 JSON 相關的 Converter api.addUser(user);響應中返回json
HTTP/1.1 200 OK content-type: application/json; charset=utf-8 content-length: 234 [{"login":"mojombo","id":1,"node_id":"MDQ6VXNl cjE=","avatar_url":"https://avatars0.githubuse rcontent.com/u/1?v=4","gravat......請求中提交二進制內容
POST /user/1/avatar HTTP/1.1 Host: hencoder.com Content-Type: image/jpeg Content-Length: 1575 JFIFHH9......對應Retrofit代碼 :
@POST("users/{id}/avatar") Call<User> updateAvatar(@Path("id") String id, @Body RequestBody avatar); ... RequestBody avatarBody = RequestBody.create(MediaType.parse("image/jpeg"), avatarFile); api.updateAvatar(id, avatarBody)響應中返回二進制內容
HTTP/1.1 200 OK content-type: image/jpeg content-length: 1575 JFIFHH9...... image/jpeg application/zip ... : 單文件,用于 Web Api 的響應或者 POST / PUT 的請求。比如單個文件上傳可以直接通過image/jpge的type類型來上傳,而不是必須要用multitype/form-data類型。
-
-
Transfer: chunked (分塊傳輸編碼 Chunked Transfer Encoding)
用于當響應發(fā)起時,內容長度還沒能確定的情況下,需要將響應內容分塊傳輸。和 Content-Length 不不同時使用。用途是盡早給出響應,減少用戶等待。
格式
HTTP/1.1 200 OK Content-Type: text/html Transfer-Encoding: chunked 4 Chun 9 ked Trans 12 fer Encoding 0 Location : 指定重定向的目標 URL
User-Agent : 用戶代理理,即是誰實際發(fā)送請求、接受響應的,例如手機瀏覽器?、某款手機 App
-
Range / Accept-Range : 指定body的內容范圍
按范圍取數(shù)據(jù) :
Accept-Range: bytes響應報文中出現(xiàn),表示服務器支持按字節(jié)來取范圍數(shù)據(jù)
Range: bytes=<start>-<end>請求報文中出現(xiàn),表示要取哪段數(shù)據(jù)
Content-Range:<start>-<end>/total響應報文中出現(xiàn),表示發(fā)送的是哪段數(shù)據(jù)
作用:斷點續(xù)傳、多線程下載
其他Headers
- Accept: 客戶端能接受的數(shù)據(jù)類型。如 text/html
- Accept-Charset: 客戶端接受的字符集。如 utf-8
- Accept-Encoding: 客戶端接受的壓縮編碼類型。如 gzip
- Content-Encoding:壓縮類型。如 gzip
Cache
作用:在客戶端或中間網(wǎng)絡節(jié)點緩存數(shù)據(jù),降低從服務器?取數(shù)據(jù)的頻率,以提高網(wǎng)絡性能。
cache和buffer的區(qū)別:cache是請求過的數(shù)據(jù),為了防止下次需要再次訪問將數(shù)據(jù)做緩存。buffer是對于確定的要訪問的數(shù)據(jù),提前準備好,當需要的時候可以快速獲取。
REST
REST HTTP 即正確使用 HTTP。包括:
- 使用資源的格式來定義 URL
- 規(guī)范地使用 method 來定義網(wǎng)絡請求操作
- 規(guī)范地使用 status code 來表示響應狀態(tài)
- 其他符合 HTTP 規(guī)范的設計準則


