HTTP的原理和工作機制

HTTP 的定義

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

HTTP的工作方式
http工作方式.png

瀏覽?:

用戶輸入地址后回車或點擊鏈接 -> 瀏覽器?拼裝 HTTP 報文并發(fā)送請求給服務器? -> 服務器?處理理請求后發(fā)送響應報文給瀏覽器? -> 瀏覽器?解析響應報文并使用渲染引擎顯示到界?面

手機 App:

用戶點擊或界面自動觸發(fā)聯(lián)網(wǎng)需求 -> Android 代碼調用拼裝 HTTP 報文并發(fā)送請求到服務器? -> 服務器?處理理請求后發(fā)送響應報文給手機 -> Android 代碼處理理響應報文并作出相應處理理(如儲存數(shù)據(jù)、加工數(shù)據(jù)、顯示數(shù)據(jù)到界面)

URL和 http報文
  1. URL

    三部分:協(xié)議類型、服務器?地址(和端口號)、路徑(Path)

    協(xié)議類型://服務器?地址[:端口號]路徑

    http://hencoder.com/users?gender=male

    URL.png
  1. 報文格式

    • 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ī)范的設計準則
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容