發起一個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
能夠看到一個請求報文大體分三部分:請求行、Headers、Bodyjava
請求行包含三部分信息,method(get/post等)、path(除了域名以外的路徑)、HTPP version(HTTP協議的版本)。android
Headers是一個metadata,元數據,相似於java中的元註解,元註解用於描述註解,元數據用於描述數據,Headers事實上是對body的描述,好比上面的三個head分別描述了,這次請求的域名,數據類型,數據長度等等。git
主體數據能夠由不少種,配合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
能夠看到一個響應報文大體分三部分:狀態行、Headers、Body 其餘兩部分跟請求報文相似,咱們看一下狀態行api
狀態行也包含三部分信息,HTPP version(HTTP協議的版本)、status(通常成功爲200)、message(自定的描述信息)。瀏覽器
經常使用的請求方法有GET/POST/PUT/DELETE/HEAD等等,固然還有其餘的,可是咱們就只介紹這些:服務器
其中HEAD跟GET看上去沒有什麼區別,實際上除了沒有返回Body以外,HEAD和GET徹底同樣,好比有些場景你想先測試這個接口,或者想先拿到Headres進行判斷以後再肯定要不要發起GET請求拿數據,就能夠用HEAD。
數據類型和數據長度。
Content-Leanght並不老是有效的,當存在Transfer-Encoding:chunked時,Content-Leanght就是無效的,Transfer-Encoding標識告訴服務器,數據是分塊傳輸,服務器能夠在拿到前面的數據時,先進行耗時性操做,等到請求數據傳輸完成以後,能夠更快得對客戶端進行響應,這是一種提升接口效率的方法。
重定向的地址,當響應報文中狀態行的status爲301(不必定只是這個),表示須要重定向,客戶端則重定向到Location這個新的地址。
用戶代理,這個head告訴服務器是什麼設備在進行請求,好比一個網頁,就能夠根據手機瀏覽器或者電腦瀏覽器去返回不一樣的html,達到適配的效果。
經過這個head咱們能夠取指定某部分的數據,當響應報⽂文中出現 Accept-Range: bytes ,表示服務器支持按字節來取範圍數據; 請求報⽂中給出 Range: bytes=start-end ,表示要取哪段數據;響應報文中出現 Content-Range:start-end/total ,表示發送的是哪段數據。 咱們能夠用它來作斷電續傳,多線程下載等
Cookie是一個逐步被棄用的東西,它本質是一個本地存儲機制,服務器返回Set-Cookie給客戶端,客戶端保存下來,而後每次請求都在Cookie中攜帶發過去,早期用來作登陸、作購物車,也用於作用戶偏好。
用來取代Cookie作登陸的東西的,咱們如今經常使用的第三方登陸用的就是它。
告訴服務器,客戶端能接受的Body類型,跟Content-Type相似。
告訴服務器,客戶端能接受的字符集。
告訴服務器,客戶端能接受的壓縮編碼,好比gzip。
壓縮方式。如gzip。
瞭解狀態碼的意思,起碼之後知道什麼狀況下要找後臺處理,什麼狀況要本身先排查。