一、nsurlconnection的常用類
(1)nsurl:請求位址
(2)nsurlrequest:封裝一個請求,儲存發給伺服器的全部資料,包括一個nsurl對象,請求方法、請求頭、請求體....
(3)nsmutableurlrequest:nsurlrequest的子類
(4)nsurlconnection:負責發送請求,建立用戶端和伺服器的連接配接。發送nsurlrequest的資料給伺服器,并收集來自伺服器的響應資料
補充:一個nsurlrequest對象就代表一個請求,它包含的資訊有:
一個nsurl對象
請求方法、請求頭、請求體
請求逾時
…...
二、nsurlconnection的使用
1.簡單說明
使用nsurlconnection發送請求的步驟很簡單
(1)建立一個nsurl對象,設定請求路徑(設定請求路徑)
(2)傳入nsurl建立一個nsurlrequest對象,設定請求頭和請求體(建立請求對象)
(3)使用nsurlconnection發送nsurlrequest(發送請求)

2.代碼示例
(1)發送請求的三個步驟:
1.設定請求路徑
2.建立請求對象
3.發送請求
3.1發送同步請求(一直在等待伺服器傳回資料,這行代碼會卡住,如果伺服器,沒有傳回資料,那麼在主線程ui會卡住不能繼續執行操作)有傳回值
3.2發送異步請求:沒有傳回值
說明:任何nsurlrequest預設都是get請求。
(2)發送同步請求代碼示例:
模拟器情況:
列印伺服器傳回的資訊:
補充說明:
1.提前的表單驗證
2.發送請求給伺服器(帶上賬号和密碼)
get請求:請求行\請求頭\請求體
注意:get請求中不存在請求體,因為所有的資訊都寫在url裡面。在ios裡面,請求行和請求頭都不用寫。
(3)發送異步請求
發送異步請求有兩種方式:
1)使用block回調
2)代理
a.使用block回調方法發送異步請求
使用block回調代碼示例:
模拟器情況(注意這裡使用了第三方架構):
列印檢視:
代碼說明:
block代碼段:當伺服器有傳回資料的時候調用會開一條新的線程去發送請求,主線程繼續往下走,當拿到伺服器的傳回資料的資料的時候再回調block,執行block代碼段。這種情況不會卡住主線程。
隊列的作用:決定這個block操作放在哪個線程執行?
重新整理ui界面的操作應該放在主線程執行,不能放在子線程,在子線程處理ui相關操作會出現一些莫名的問題。
提示:
(1)建立一個操作,放在nsoperation隊列中執行,預設是異步執行的。
(2)mainqueue 傳回一個和主線程相關的隊列,即主隊列。
新的問題:如果向伺服器發送請求,卻并沒有拿到資料,那麼程式會崩潰(data不能為空)
改進代碼:
解析data
說明:使用nsjsonserialization 傳回的對象,取決于最外層是什麼,如果是{}那就是字典,[]那就是數組等。
首先确定請求路徑,然後建立請求對象(預設發送的時get請求),使用異步方法(一調 用這個方法,它會自動開啟一個子線程去發送請求,當請求成功,資料傳回的時候自動調用内部的代碼段,這個代碼段在那個線程執行取決于隊列,如果是主隊列, 那麼在子線程發送請求成功拿到伺服器的資料後,回到主線程中解析資料,重新整理ui界面)。
b.使用代理方法發送異步請求
要監聽伺服器傳回的data,是以使用<nsurlconnectiondatadelegate>協定
常見大代理方法如下:
使用異步方法發送get請求的代碼示例:
補充:
(1)資料的處理
在didreceivedata:方法中,拼接接收到的所有資料,等所有資料都拿到後,在connectiondidfinishloading:方法中進行處理
(2)網絡延遲
在做網絡開發的時候,一定要考慮到網絡延遲情況的處理,可以在伺服器的代碼設定一個斷點模拟。
在伺服器代碼的登入方法中設定斷點
設定請求的最大延遲
三、nsmutableurlrequest
nsmutableurlrequest是nsurlrequest的子類,常用方法有
設定請求逾時等待時間(超過這個時間就算逾時,請求失敗)- (void)settimeoutinterval:(nstimeinterval)seconds;
設定請求方法(比如get和post)- (void)sethttpmethod:(nsstring *)method;
設定請求體- (void)sethttpbody:(nsdata *)data;
設定請求頭- (void)setvalue:(nsstring *)value forhttpheaderfield:(nsstring *)field;