HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,在TCP/IP體系中屬於最高層(應用層)是用於從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。
HTTP協議工做於客戶端-服務端架構爲上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。 這是最基本的HTTP工做原理,如圖所示: html
HTTP屬於應用層,應用層傳輸的數據單位是報文。
HTTP報文分爲請求報文和響應報文。java
請求行組成:請求方法,請求URL,協議版本。git
方法 | 做用 | 說明 |
---|---|---|
GET | 獲取資源 | 用來請求訪問已被URI標識的 |
POST | 傳輸實體主體 | POST主要用來傳輸數據,而GET主要用來獲取資源 |
HEAD | 獲取報文首部 | 和GET方法相似,可是不返回報文實體主體部分 |
PUT | 上傳文件 | 用來傳輸文件,因爲自身不帶驗證機制,任何人均可以上傳文件 |
DELETE | 刪除文件 | 與PUT功能相反,而且一樣不帶驗證機制 |
OPTIONS | 查詢支持的方法 | 用來查詢針對請求URI請求的資源支持的方法 |
TRACE | 追蹤路徑 | 服務器會將通訊路徑返回給客戶端 |
CONNECT | 要求用隧道協議鏈接代理 | 使用 SSL(Secure Sockets Layer,安全套接層)和TLS(Transport Layer Security,傳輸層安全)協議把通訊內容加密後經網絡隧道傳輸 |
URL(Uniform Resource Locator)統一資源定位符,表示資源的地點(互聯網上的地址)。
URI(Uniform Resource Identifier)統一資源標識符,用字符串標識某一互聯網資源,URL是URI的子集。github
請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號「:」分隔。
有4種類型的首部字段:通用首部字段、請求首部字段、響應首部字段和實體首部字段,全部完整首部
這裏咱們先了解下經常使用的請求首部。web
字段 | 說明 |
---|---|
Accept | 用戶代理可處理的媒體類型 |
Accept-Encoding | 優先的內容編碼 Accept-Encoding: gzip, deflate, br |
Authorization | Web 認證信息 |
Cache-Control | 控制緩存的行爲 |
Connection | 控制再也不轉發給代理的首部字段、管理持久鏈接 |
Content-Encoding | 實體主體適用的編碼方式 |
Content-Type | 實體主體的媒體類型 |
Content-Length | 實體主體的大小 |
Host | 請求資源所在服務器 |
If-Modified-Since | 服務器上次返回的Last-Modified 日期,若是在這個日期以後,請求的資源都沒有更新過,則返回304 Not Modified響應 |
If-None-Match | 比較實體標記,值爲上一次返回的ETag, 通常會和 If-Modified-Since 一塊兒返回 |
Referer | 對請求中URI的原始獲取方 |
User-Agent | HTTP 客戶端程序的信息 |
Cookie | 保存狀態信息 |
Transfer-Encoding | 指定報文主體的傳輸編碼方式 |
請求包體不在 GET 方法中使用,而是在POST 方法中使用。
HTTP請求的請求體有三種不一樣的形式:json
使用抓包工具或者Chrome來查看瀏覽器
POST /getconfig HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; Redmi Note 7 MIUI/V10.3.2.0.PFGCNXM)
Host: data.mistat.xiaomi.com
Accept-Encoding: gzip
Content-Length: 205
Connection: close
app_id=1000274&app_version=10.8.3
複製代碼
Content-Type
,User-Agent
,Host
,Accept-Encoding
,Content-Length
,Connection
狀態行由HTTP協議版本字段、狀態碼和狀態碼的描述文本 3 個部分組成,他們之間使用空格隔開; 協議版本和請求中的對應,狀態碼和描述會一一對應。緩存
狀態碼由三位數字組成,第一位數字表示響應的類型,經常使用的狀態碼有五大類:安全
經常使用的一些狀態碼和描述服務器
狀態碼、描述 | 說明 |
---|---|
100 Continue | 代表到目前爲止都很正常,客戶端能夠繼續發送請求或者忽略這個響應 |
狀態碼、描述 | 說明 |
---|---|
200 OK | 請求成功 |
204 No Content | 請求已經成功處理,可是返回的響應報文不包含實體的主體部分 |
206 Partial Content | 表示客戶端進行了範圍請求, 響應報文包含由Content-Range指定範圍的實體內容 |
狀態碼、描述 | 說明 |
---|---|
301 Moved Permanently | 永久性重定向 |
302 Found | 臨時性重定向 |
304 Not Modified | 若是請求報文首部包含一些條件,If-Match,If-Range, If-Modified-Since,If-None-Match,,If-Unmodified-Since。 若是不知足條件,則服務器會返回 304 狀態碼 |
307 Temporary Redirect | 臨時重定向,與 302 的含義相似, 可是307要求瀏覽器不會把重定向請求的POST方法改爲GET方法 |
狀態碼、描述 | 說明 |
---|---|
400 Bad Request | 請求報文中存在語法錯誤 |
401 Unauthorized | 請求須要驗證用戶 |
403 Forbidden | 訪問權限問題 |
404 Not Found |
狀態碼、描述 | 說明 |
---|---|
500 Internal Server Error | 服務器正在執行請求時發生錯誤 |
503 Service Unavailable | 服務器正在執行請求時發生錯誤 |
和請求頭部同樣,由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號「:」分隔。
經常使用的請求首部
字段 | 說明 |
---|---|
Cache-Control | 控制緩存的行爲 |
Connection | 控制再也不轉發給代理的首部字段、管理持久鏈接 |
Transfer-Encoding | 指定報文主體的傳輸編碼方式 |
Content-Encoding | 實體主體適用的編碼方式 |
Content-Type | 實體主體的媒體類型 |
Content-Length | 實體主體的大小 |
Expires | 實體主體過時的日期時間 |
ETag | 資源的匹配信息,和If-Nome-Match 對應 |
Date | 服務端 |
Location | 令客戶端重定向至指定 URI |
Server | HTTP 服務器的安裝信息 |
Last-Modified | 資源的最後修改日期時間 |
Set-Cookie | 設置Cookie,客戶端獲得響應報文後把 Cookie 內容保存到瀏覽器中 |
其餘更詳細的首部信息,能夠參考這裏
服務器返回給客戶端的文本信息。 和請求包體的分類同樣。
HTTP/1.1 200 OK
Date: Sat, 13 Jul 2019 08:40:52 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Connection: close
{"errorCode":-2,"reason":"no changing","result":null}
複製代碼
HTTP 有如下安全性問題:
HTTPS 並非新協議,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通訊,再由 SSL 和 TCP 通訊,也就是說 HTTPS 使用了隧道進行通訊。
經過使用 SSL,HTTPS 具備了加密(防竊聽)、認證(防假裝)和完整性保護(防篡改)
協議 | 原理 | 數據格式 | 傳輸速度 | 端口 |
---|---|---|---|---|
HTTP | 應用層 | 明文傳輸 | 三次握手,傳輸三個包 | 80 |
HTTPS | 傳輸層 | SSL加密 | 三次握手基礎上增長ssl握手(9個包), 傳輸12個包 |
443 |
Volley是Google 官方出的一套小而巧的異步請求庫,該框架封裝的擴展性很強,支持 HttpClient、HttpUrlConnection,甚至支持OKHttp。
OKHttp是Square 公司開源的針對 Java 和 Android 程序,封裝的一個高性能 http 請求庫,因此它的職責跟 HttpUrlConnection 是同樣的,支持 spdy、http 2.0、websocket ,支持同步、異步。 已被谷歌加入到Android的源碼中。
Retrofit是Square公司出品的默認基於OKHttp 封裝的一套 RESTful 網絡請求框架
後續文章會從OKHttp、Retrofit角度來分析Http。