iOS中HTTP傳輸協議
一、HTTP協議
HTTP本質上是一種協議,全稱是Hypertext Transfer Protocol,即超文本傳輸協議。從名字上可以看出該協議用于規定客戶端與服務端之間的傳輸規則,所傳輸的內容不局限于文本(其實可以傳輸任意類型的數據)。
圖1.1傳輸示意圖.png
二、HTTP請求與響應的內容
當我們往服務端發送一條HTTP請求時都發送了哪些東西過去呢?
先看一個POST請求的示例圖:
圖2.1 HTTP_POST請求示例.png
注:本文使用Paw來模擬發送HTTP請求,使用Charles抓包,Charles選中“Request”以及“Raw”選項就可以看到請求的全部內容
以上示例圖中其實已經包含了一個HTTP請求所必備的幾大要素:請求行、請求頭(headerField)、請求體(body);同理,響應也有狀態行、響應頭、實體內容。接下來我們逐個展開。
1、請求行
請求行包含請求方法(Method)、請求統一資源標識符(URI)、HTTP版本號,如圖2.1第一行所示:
圖2.2 請求行.png
請求方法就是我們所熟悉的POST、GET、HEAD、PUT等
URI就是URL中排除掉Host剩下的部分,也就是資源在服務器本地上的路徑
HTTP版本號,目前主流的版本是1.1(1999年開始采用),最新的版本是2.0(2015年5月發布)。不同版本之間差異下面會再展開
2、請求頭
請求頭主要存放對客戶端想給服務端的附加信息,下圖框框的部分就是請求頭:
圖2.3 請求頭.png
HTTP請求在iOS中用NSURLRequest與NSMutableRequest表示;HTTP響應用NSHTTPURLResponse表示。
Host: 目標服務器的網絡地址
Accept: 讓服務端知道客戶端所能接收的數據類型,如text/html */*
Content-Type: body中的數據類型,如application/json; charset=UTF-8
Accept-Language: 客戶端的語言環境,如zh-cn
Accept-Encoding: 客戶端支持的數據壓縮格式,如gzip
User-Agent: 客戶端的軟件環境,我們可以更改該字段為自己客戶端的名字,比如QQ music v1.11,比如瀏覽器Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2
Connection: keep-alive,該字段是從HTTP 1.1才開始有的,用來告訴服務端這是一個持久連接,“請服務端不要在發出響應后立即斷開TCP連接”。關于該字段的更多解釋將在后面的HTTP版本簡介中展開。
Content-Length: body的長度,如果body為空則該字段值為0。該字段一般在POST請求中才會有。
POST請求的body請求體也有可能是空的,因此POST中Content-Length也有可能為0
Cookie: 記錄者用戶信息的保存在本地的用戶數據,如果有會被自動附上
值得一提的是,在iOS中當你發送一個任意請求時,不管你愿不愿意,NSURLRequest都會自動幫你記錄你所訪問的URL上設置的cookie。在iOS中用NSHTTPCookieStorage表示,是一個單例。通過
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in [cookieJar cookies]) { NSLog(@“%@”, cookie); }
可以獲取目前被自動保存的所有cookie。對cookie的操作感興趣的請移步iOS中http請求使用cookie這篇文章。
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%