Android網絡編程-HTTP/HTTPS

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,在TCP/IP體系中屬於最高層(應用層)是用於從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。
HTTP協議工做於客戶端-服務端架構爲上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。 這是最基本的HTTP工做原理,如圖所示: html

C/S架構

HTTP報文

HTTP屬於應用層,應用層傳輸的數據單位是報文。
HTTP報文分爲請求報文和響應報文。java

請求報文

請求報文
HTTP請求報文由如下4個部分組成:

  • 請求行:請求類型,要訪問的資源以及所使用的HTTP版本。
  • 請求頭部:服務器要使用的附加信息。
  • 空行:請求頭部後面的空行是必須的
  • 請求包體:能夠添加任意的其餘數據

請求行

請求行組成:請求方法,請求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

URL(Uniform Resource Locator)統一資源定位符,表示資源的地點(互聯網上的地址)。
URI(Uniform Resource Identifier)統一資源標識符,用字符串標識某一互聯網資源,URL是URI的子集。github

協議版本

  • HTTP/1.0:HTTP協議的第二個版本,第一個在通信中指定版本號的HTTP協議版本,至今仍被普遍採用
  • HTTP/1.1:HTTP協議的第三個版本是HTTP 1.1,是目前使用最普遍的協議版本
  • HTTP/2.0:HTTP 2.0是下一代HTTP協議,目前應用還很是少

請求頭部

請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號「:」分隔。
有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

  • 任意類型:服務器不會解析請求體,請求體的處理須要本身解析,好比JSON
  • 鍵值對(application/x-www-form-urlencoded):最多見的 POST 提交數據的方式,表單模式
  • 文件分割:請求體被分紅爲多個部分,文件上傳時會被使用

示例

使用抓包工具或者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
複製代碼
  • 請求行:顯示Post請求,協議版本爲HTTP/1.1
  • 請求頭部:Content-Type,User-Agent,Host,Accept-Encoding,Content-Length,Connection
  • 請求體:Content-Type聲明爲鍵值對

響應報文

響應報文
HTTP 響應報文由狀態行、響應頭部、空行和響應包體4個部分組成。

狀態行

狀態行由HTTP協議版本字段、狀態碼和狀態碼的描述文本 3 個部分組成,他們之間使用空格隔開; 協議版本和請求中的對應,狀態碼和描述會一一對應。緩存

狀態碼、描述

狀態碼由三位數字組成,第一位數字表示響應的類型,經常使用的狀態碼有五大類:安全

  • 1xx:Informational(信息性狀態碼),接收的請求正在處理;
  • 2xx:Success(成功狀態碼),請求正常處理完畢;
  • 3xx:Redirection(重定向狀態碼),須要進行附加操做以完成請求;
  • 4xx:Client Error(客戶端錯誤狀態碼),服務器沒法處理請求;
  • 5xx:Server Error(服務器錯誤狀態碼),服務器處理請求出錯;

經常使用的一些狀態碼和描述服務器

1xx
狀態碼、描述 說明
100 Continue 代表到目前爲止都很正常,客戶端能夠繼續發送請求或者忽略這個響應
2xx
狀態碼、描述 說明
200 OK 請求成功
204 No Content 請求已經成功處理,可是返回的響應報文不包含實體的主體部分
206 Partial Content 表示客戶端進行了範圍請求,
響應報文包含由Content-Range指定範圍的實體內容
3xx
狀態碼、描述 說明
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方法
4xx
狀態碼、描述 說明
400 Bad Request 請求報文中存在語法錯誤
401 Unauthorized 請求須要驗證用戶
403 Forbidden 訪問權限問題
404 Not Found
5xx
狀態碼、描述 說明
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}
複製代碼
  • 響應行:返回響應碼200 Ok,表示服務端返回數據成功
  • 響應頭部:Content-Type設置返回的類型爲JSON格式
  • 響應包體:返回具體JSON數據

HTTPS

HTTP 有如下安全性問題:

  • 使用明文進行通訊,內容可能會被竊聽;
  • 不驗證通訊方的身份,通訊方的身份有可能遭遇假裝;
  • 沒法證實報文的完整性,報文有可能遭篡改。

HTTPS 並非新協議,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通訊,再由 SSL 和 TCP 通訊,也就是說 HTTPS 使用了隧道進行通訊。
經過使用 SSL,HTTPS 具備了加密(防竊聽)、認證(防假裝)和完整性保護(防篡改)

HTTPS

與HTTP區別

協議 原理 數據格式 傳輸速度 端口
HTTP 應用層 明文傳輸 三次握手,傳輸三個包 80
HTTPS 傳輸層 SSL加密 三次握手基礎上增長ssl握手(9個包),
傳輸12個包
443

缺點

  • 由於須要進行加密解密等過程,所以速度會更慢;
  • 須要支付證書受權的高額費用。

HTTP框架

Volley

Volley是Google 官方出的一套小而巧的異步請求庫,該框架封裝的擴展性很強,支持 HttpClient、HttpUrlConnection,甚至支持OKHttp。

OKHttp

OKHttp是Square 公司開源的針對 Java 和 Android 程序,封裝的一個高性能 http 請求庫,因此它的職責跟 HttpUrlConnection 是同樣的,支持 spdy、http 2.0、websocket ,支持同步、異步。 已被谷歌加入到Android的源碼中。

Retrofit

Retrofit是Square公司出品的默認基於OKHttp 封裝的一套 RESTful 網絡請求框架

後續文章會從OKHttp、Retrofit角度來分析Http。

參考

相關文章
相關標籤/搜索