iOS -讀書筆記-網路請求

來源:互聯網
上載者:User

標籤:ios   網路   

知道“3次握手”嗎?突然想起這個詞

什麼是3次握手?
TCP三向交握/四次揮手詳解 這裡是3次握手的詳細解釋
3次握手就是為了可靠的傳送資料,TCP(什麼是TCP呢?TCP就是一種可靠傳輸的協議)在發送資料之前,兩台主機之間進行3次握手。3次握手完成後才發送資料。

預備知識: 位碼即tcp標誌位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重設) URG(urgent緊急)
Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求後要確認聯機資訊,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三向交握:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則串連建立成功。
完成三向交握,主機A與主機B開始傳送資料。

進入正題:
iOS 中首選的通訊方式是HTTP。iOS提供的最方便的網路API也是針對HTTP的。
上文中說的“三向交握”就是為了建立一個TCP串連,HTTP請求和響應就是在TCP串連上來完成的,TCP串連可以重用,也就是說,並不是每次HTTP請求都需要建立TCP串連,只要TCP串連不斷開,HTTP請求就可以一直使用。

HTTP和HTTPS的差別在什麼地方?
安全。其實HTTPS協議就是SSL+HTTP協議。HTTPS和HTTP之間最重要的差別在於會話的建立階段。TCP串連建立好之後,HTTP請求發送之前,用戶端與伺服器之間必須建立SSL(那麼SSL又是什麼呢?下面說)會話。會話建立完畢後,在TCP串連之上傳輸的所有資料都是加密的。

SSL是什嗎?
SSL (Secure Socket Layer),是一種保證伺服器和用戶端安全通訊的協議。使用HTTPS協議,所有的HTTP資料都是在SSL協議封裝之上傳輸的。突然冒出另外一個詞TLS,其實TLS是SSL標準化的產物,事實上我們現在用的都是TLS,但因為曆史上習慣了SSL這個稱呼平常還是以SSL為多。關於SSL的介紹看下這篇文章講的很好SSL/TLS協議運行機制的概述

iOS 最高層的HTTP API

NSURL 、NSURLRequest 、NSURLConnection 、NSURLResponse 對象

1 NSURL

通過NSURL 對象輕鬆方便的訪問URL所指向的內容,NSURL 可以指向檔案資源,也可以指向網路資源。
NSURL *url = [NSURL URLWithString:@”“];
NSData *data = [NSData dataWithContentsOfURL:url];
即可以擷取網路資源又可以獲檔案資源。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:@"檔案路徑"];    [request setHTTPBodyStream:inStream];

NSURL還提供了很多方法來讀取URL各個部分的值,比如url.port擷取一下url的連接埠。
在建立NSURL對象前需要對URL字串進行百分比符號編碼。RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元。相關更詳細的看百分比符號編碼

2 NSURLRequest

建立好NSURL對象後接下來就需要執行下一步:建立NSURLRequest對象。NSURLRequest 對象包含了載入URL內容所需的資訊。iOS中的URL載入系統支援HTTP 、HTTPS、FTP和FILE URL內容的載入
URL載入系統提供了一種擴充方式一處理新的協議,方式就是建立NSURLProtocol的子類,然後將返回的結果提供給URL載入系統。

NSURL *url = [NSURL URLWithString:@"www.baidu.com"];    NSURLRequest *request = [NSURLRequest requestWithURL:url];

採用預設的參數來建立對象。如果是HTTP或者HTTPS 那麼要求方法是GET,並且使用作業系統提供的預設頭。

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

設定緩衝策略和請求時間,NSURLRequest也提供了許多方法來擷取請求的屬性。但是不能設定,如果想要設定,那麼來用NSMutableRequest。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    [request setHTTPMethod:@"POST"];    [request setHTTPBody:[@"body" dataUsingEncoding:NSUTF8StringEncoding]];    [request setAllHTTPHeaderFields:@{@"":@""}];

NSMutableRequest 設定各種參數。
發送大容量內容可以使用NSInputSteam,使用該對象提供請求體而無需將整個內容載入到記憶體中。發送圖片或者視頻這是最佳的選擇。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:@"檔案路徑"];    [request setHTTPBodyStream:inStream];

3 NSURLConnection

NSURLConnection 對象是URL載入統統活動的中心。用於串連伺服器擷取響應。提供了同步、非同步、隊列非同步操作模式。同步最簡單,但是會有堵塞線程等缺點。非同步模式下調用委託代理來處理資料。

4 NSURLReponse

NSURLResponse 對象會在URL載入請求完畢後返回。NSError對象與DSData對象,如果請求出現問題或伺服器問題會返回NSError對象,如果有響應返回NSData對象就會包含響應體.
NSURLReponse提供了很多屬性資訊。
MIMEType 結果資料的MIME類型。該值來源於伺服器。
expectedContentLenth 返回內容的大小,可能與實際不符。
suggestedFilename 提供的檔案名稱,要麼來自伺服器提供的內容的檔案名稱,要麼來自URL和MIME類型。
URL 返回內容的URL。由於成定向的原因,URL可能與請求提供的URL不同。
textEncodingName 最初資料來源所用的文本編碼名。
HSHTTPURLResponse 是NSURLResponse的子類,它包含特定於HTTP請求的屬性。
回應標頭 - allHeaderFields
HTTP狀態代碼 - statusCode

文章來自《iOS進階編程》 掃盲

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

iOS -讀書筆記-網路請求

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.