HTTP 的概念、原理、工做機制、數據格式

發起一個http/https請求是一個前端開發常常在作的事情,可是大多數時候咱們只是用別人二次封裝過的框架,咱們知道請求地址,請求參數,處理返回結果,好比android用的Retrofit就直接返回咱們定義好的一個數據結構bean。這就好像一個黑盒,咱們知道輸入輸出,可是不知道過程當中發生了什麼事情,那麼,你想知道嗎?html

咱們先來看看當咱們發起一個網絡請求的時候,咱們發送了什麼東西:前端

請求報文

  • GET /users HTTP/1.1
  • Host: api.github.com
  • Content-Type: text/plain
  • Content-Length: 243
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody

能夠看到一個請求報文大體分三部分:請求行HeadersBodyjava

請求行

請求行包含三部分信息,method(get/post等)、path(除了域名以外的路徑)、HTPP version(HTTP協議的版本)。android

Headers

Headers是一個metadata,元數據,相似於java中的元註解,元註解用於描述註解,元數據用於描述數據,Headers事實上是對body的描述,好比上面的三個head分別描述了,這次請求的域名,數據類型,數據長度等等。git

Body

主體數據能夠由不少種,配合Content-Type,能夠發送json( application/json ),或者html(text/html ),或者表單( x-www-form-urlencoded ),二進制文件( multipart/form-data )等等,body也能夠爲空,好比get請求後者delete請求的body就是空的。github

服務器響應咱們的請求又給咱們返回了什麼東西:json

響應報文

  • HTTP/1.1 200 OK
  • Content-Type: text/plain
  • Content-Length: 243
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody

能夠看到一個響應報文大體分三部分:狀態行HeadersBody 其餘兩部分跟請求報文相似,咱們看一下狀態行api

狀態行

狀態行也包含三部分信息,HTPP version(HTTP協議的版本)、status(通常成功爲200)、message(自定的描述信息)。瀏覽器

Method

經常使用的請求方法有GET/POST/PUT/DELETE/HEAD等等,固然還有其餘的,可是咱們就只介紹這些:服務器

其中HEAD跟GET看上去沒有什麼區別,實際上除了沒有返回Body以外,HEAD和GET徹底同樣,好比有些場景你想先測試這個接口,或者想先拿到Headres進行判斷以後再肯定要不要發起GET請求拿數據,就能夠用HEAD。

Headers

Content-Type/Content-Leanght

數據類型和數據長度。

Transfer-Encoding

Content-Leanght並不老是有效的,當存在Transfer-Encoding:chunked時,Content-Leanght就是無效的,Transfer-Encoding標識告訴服務器,數據是分塊傳輸,服務器能夠在拿到前面的數據時,先進行耗時性操做,等到請求數據傳輸完成以後,能夠更快得對客戶端進行響應,這是一種提升接口效率的方法。

Location

重定向的地址,當響應報文中狀態行的status爲301(不必定只是這個),表示須要重定向,客戶端則重定向到Location這個新的地址。

User-Agent

用戶代理,這個head告訴服務器是什麼設備在進行請求,好比一個網頁,就能夠根據手機瀏覽器或者電腦瀏覽器去返回不一樣的html,達到適配的效果。

Range/Accept-Range

經過這個head咱們能夠取指定某部分的數據,當響應報⽂文中出現 Accept-Range: bytes ,表示服務器支持按字節來取範圍數據; 請求報⽂中給出 Range: bytes=start-end ,表示要取哪段數據;響應報文中出現 Content-Range:start-end/total ,表示發送的是哪段數據。 咱們能夠用它來作斷電續傳,多線程下載等

Cookie/Set-Cookie

Cookie是一個逐步被棄用的東西,它本質是一個本地存儲機制,服務器返回Set-Cookie給客戶端,客戶端保存下來,而後每次請求都在Cookie中攜帶發過去,早期用來作登陸、作購物車,也用於作用戶偏好。

Authorization

用來取代Cookie作登陸的東西的,咱們如今經常使用的第三方登陸用的就是它。

Accept

告訴服務器,客戶端能接受的Body類型,跟Content-Type相似。

Accept-Charset

告訴服務器,客戶端能接受的字符集。

Accept-Encoding

告訴服務器,客戶端能接受的壓縮編碼,好比gzip。

Content-Encoding

壓縮方式。如gzip。

狀態碼status

  • 1xx:臨時消息(100 可能數據太大,客戶端發送【Expet:100-continue】,請求服務器返回100,讓我分屢次發送數據的機會,返回100說明請你繼續發)
  • 2xx:成功(200:請求成功)
  • 3xx:重定向(301:永久遷移,原來網站的訪問都會被轉移過來)
  • 4xx:客戶端錯誤(404)
  • 5xx:服務器錯誤

瞭解狀態碼的意思,起碼之後知道什麼狀況下要找後臺處理,什麼狀況要本身先排查。

相關文章
相關標籤/搜索