HTTP
一. 網絡知識基礎
-
網絡編程中的幾個基本概念
- 客戶端Client: 移動應用App, 如iOS和安卓的應用
- 服務器Server: 為客戶端提供服務, 提供數據, 提供資源的機器
- 請求Request: 客戶端向服務器端索取數據的一種行為
- 響應Response: 服務器對客戶端的請求作出的反應, 一般指返回數據給客戶端
移動應用的開發, 主要是對客戶端進行的開發, 一般的網絡交互如下圖所示
-
兩種服務器的基本概念:
- 遠程服務器
- 又稱外網服務器, 正式服務器
- 使用階段: 應用上線后使用的服務器, 面向用戶, 供全體用戶使用
- 速度: 取決于服務器的性能, 用戶的網速
- 本地服務器
- 又稱內網服務器, 測試服務器
- 使用階段: 應用處于開發/測試階段時使用的服務器, 面向公司內部開發人員和測試人員
- 速度: 由于是局域網, 所以會保證網速, 有助于提高開發測試的效率, 但是無法反應出真實的情況
- 遠程服務器
-
網絡交互參考示意圖:
網絡交互.png
二. HTTP
-
URL
- URL全程: Uniform Resource Locator(統一資源定位符)
- URL就是資源的地址/位置, 互聯網上的每一個資源都有一個唯一的URL, 通過一個URL, 能找到互聯網中唯一的一個資源
- URL的基本格式: 協議://主機地址/路徑
- 協議: 不同的協議代表著不同的資源查找方式, 資源傳輸方式
- HTTP: 超文本傳輸協議, 訪問的是遠程網絡資源(網絡開發中最長用的協議)
- file: 訪問的是本地計算機上面的資源(file://不用加主機地址, 直接寫路徑)
- mailto: 訪問的是電子郵件地址
- ftp: 訪問的是共享主機的文件資源
- 主機地址: 存放著資源的主機(服務器)的IP地址(域名)
- 路徑: 資源在主機(服務器)中的具體位置
-
TCP/IP協議簇
- 通常意義上, 我們使用的網絡是在TCP/IP協議簇的基礎上運作的, 而HTTP屬于它內部的一個子集
- 計算機與網絡設備需要通信的話, 雙方就要基于相同的方法, 比如具體應該如何探測通信目標, 由哪一方發起通信, 使用什么語言去通信等, 所有的這些議定的規則, 稱之為協議
- 在協議中規定了很多的各式各樣的內容, 如選址方法, 雙方建立通信的順序等等, 這些協議如(ICMP/DNS/TCP/FTP/HTTP/SNMP/PPPoE/IP/FDDI等等), 通常我們把TCP/IP認為是在IP協議的通信過程中, 使用到的協議簇的總稱
- TCP協議簇里面最重要一點, 就是分層設計
- 按照層次分別分為: 應用層, 傳輸層, 網絡層, 數據鏈路層
- 其中, 與HTTP關系密切的協議有TCP, IP, DNS等
-
參考模型:
![Uploading HTTP協議_465404.png . . .]
-
HTTP協議簡介
- 移動端和PC端, 大多數遠程的網絡資源, 都使用的是HTTP協議
- HTTP協議的作用:
- 協議, 主要是為了客戶端和服務器達成的協議共識, 雙方遵守一份協議, 使用相同的語言才能互相進行交互
- HTTP的全稱: Hypertext Transfer Protocol, 即超文本傳輸協議
- 它規定了客戶端和服務器之間的數據傳輸格式, 讓雙方進行有效的數據溝通
-
如下圖所示:
HTTP協議.png
- HTTP協議的特點:
- 簡單高效: 因為HTTP協議簡單, 所以HTTP服務器的程序規模都很輕靈, 通信速度相對很快
- 靈活: HTTP可以傳輸各種各樣的數據
- HTTP0.9和1.0使用非持續鏈接
- 限制每次連接只處理一個請求, 服務器對客戶端的請求作出響應之后, 馬上斷開連接, 這種方式可以節省傳輸的時間
-
HTTP的基本通信過程
- 完整的HTTP通信可以分為2個步驟
- 請求: 客戶端向服務器索取數據
- 響應: 服務器返回客戶端需要的數據
- 完整步驟
- 確定請求路徑URL
- 獲取主機名或者域名
- DNS域名解析
- 獲取端口號
- 連接到指定服務器的端口(如: 120.20.225.18的80端口)
- 客戶端向服務器發送一個GET請求
- 服務器返回客戶端請求的數據
- 關閉連接
- 完整的HTTP通信可以分為2個步驟
-
發送HTTP請求的方法
- 在HTTP1.1版本的協議中, 定義了8中發送HTTP請求的方法
- GET, POST, OPTIONS, HEAD, PUT, DELETE, TRACE, CONNECT, PATCH
- 根據HTTP協議的設計初衷, 不同的方法對資源有著不同的操作方式:
- PUT: 增
- DELETE: 刪
- POST: 改
- GET: 查
- 其中最常用的就是GET和POST, 實際上GET和POST都能辦到增刪改查
- 參數: 就是傳遞給服務器的具體數據, 比如登錄時的賬號密碼
- 在HTTP1.1版本的協議中, 定義了8中發送HTTP請求的方法
-
GET和POST的對比: GET和POST的區別主要體現在數據的傳遞上
- GET:
- 在請求URL后面以?的形式, 接上要發給服務器的參數, 多個參數之間用&隔開
- 如: http://www.test.com/login?username=xxx&pwd=abc&type=JSON
- 由于瀏覽器和服務器對URL長度有限制, 因此在URL后面附帶的參數是有限制的, 通常不能超過1kb
- POST:
- 發給服務器的參數, 全部都放在請求體中
- 理論上, POST傳遞的數據量沒有限制(但是只是理論上, 具體還得看服務器的處理能力)
- GET:
-
GET和POST的選擇
- 如果要傳遞大量數據, 比如文件傳送, 只能使用POST請求
- GET的安全性比POST要差, 如果包含機密信息的話, 建議使用POST
- 如果只是索取數據, 建議使用GET, 比如數據查詢, 發送特定的參數, 獲取特定的數據
- 如果是對數據做出修改, 建議使用POST
-
HTTP報文
-
HTTP報文結構示意圖:
報文示意圖.png - 報文首部: 在客戶端和服務器處理時, 起重要作用的信息(比如端口數據, 端口)
- 請求報文
- 請求行: 請求方法 + URL + HTTP版本
- 請求頭:
- 請求首部字段
- 通用首部字段
- 實體首部字段
- 響應報文
- 狀態行: HTTP版本 + 狀態碼
- 響應頭:
- 響應首部字段
- 通用首部字段
- 實體首部字段
- 請求報文
- 空行:
- 報文主體(請求體/響應體): 請求參數或響應的數據
-
-
HTTP通信過程 - 請求
- HTTP協議規定: 一個完整的由客戶端發送給服務器的HTTP請求中, 包含以下內容
- 請求頭: 包含了對客戶端的環境描述, 客戶端請求信息等
- GET/background.png HTTP/1.1: 請求方法+請求資源路徑+HTTP協議版本
- Host: 120.25.225.168:81: 客戶端想訪問的服務器主機地址
- User-Agent: Mozilla/5.0: 客戶端的類型, 客戶端的軟件環境
- Accept: text/html(xx/xx): 客戶端所能接收的數據類型
- Accept-Language: zh-cn: 客戶端的語言環境
- Accept-Encoding: gzip: 客戶端支持的數據壓縮格式
- 請求體: 客戶端發給服務器的具體數據, 比如文件數據(注: 只有POST請求才有)
-
HTTP通信過程 - 響應
- 客戶端向服務器發送請求, 服務器應當響應客戶端的請求, 并且返回數據給客戶端
- HTTP協議規定: 一個完整的HTTP響應應該包含以下內容
- 響應頭: 包含了對服務器的描述, 對返回數據的描述
- HTTP/1.1 200 OK: HTTP協議版本, 狀態碼, 狀態的英文說明
- Server: Apache-Coyote/1.1: 服務器的類型
- Content-Type: image/jpeg: 返回數據的類型
- Content-Length: 56811: 返回數據的長度
- Date: Mon, 23 Jun 2014 12:54:52 GMT: 響應的時間
- 響應體: 服務器返回給客戶端的具體數據, 比如請求一個文件, 返回的整體文件數據