重點 (九) : NSURLConnection

常用類

NSURL:請求地址

NSURLRequest:一個NSURLRequest對象就代表一個請求,它包含的信息有

一個NSURL對象

請求方法、請求頭柑船、請求體

請求超時

… …

NSMutableURLRequest:NSURLRequest的子類

NSURLConnection(是它發(fā)送NSURLRequest數(shù)據給服務器,并且收集來自服務器的響應數(shù)據)

負責發(fā)送請求澎怒,建立客戶端和服務器的連接

發(fā)送NSURLRequest的數(shù)據給服務器,并收集來自服務器的響應數(shù)據

(也就是說它有兩個作用,一個是負責發(fā)送請求數(shù)據,另外一個就是收集來自服務器的響應數(shù)據)

默認情況下脸甘,NSURLConnection發(fā)送的是一個異步請求

默認情況下知牌,NSURLConnection的代理方法在主線程中進行調用(方便在拿到數(shù)據后,直接處理一些和UI相關的操作斤程,而不需要考慮線程間通信)

通過該方法設置代理角寸,會自動的發(fā)送請求
1.png

NSURLConnection發(fā)送請求
NSURLConnection常見的發(fā)送請求方法有以下幾種
1.同步請求

  • (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;

2.異步請求:根據對服務器返回數(shù)據的處理方式的不同,又可以分為2種
block回調

  • (void)sendAsynchronousRequest:(NSURLRequest) request queue:(NSOperationQueue queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;

3.代理

  • (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
  • (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
  • (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;

在startImmediately = NO的情況下忿墅,需要調用start方法開始發(fā)送請求

  • (void)start;

成為NSURLConnection的代理扁藕,最好遵守NSURLConnectionDataDelegate協(xié)議

NSURLConnectionDelegate
NSURLConnectionDataDelegate協(xié)議中的代理方法
開始接收到服務器的響應時調用

  • (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

接收到服務器返回的數(shù)據時調用(服務器返回的數(shù)據比較大時會調用多次)

  • (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

服務器返回的數(shù)據完全接收完畢后調用

  • (void)connectionDidFinishLoading:(NSURLConnection *)connection;

請求出錯時調用(比如請求超時)

  • (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

NSMutableURLRequest
NSMutableURLRequest是NSURLRequest的子類,常用方法有
設置請求超時等待時間(超過這個時間就算超時疚脐,請求失斠诟獭)

  • (void)setTimeoutInterval:(NSTimeInterval)seconds;

設置請求方法(比如GET和POST)

  • (void)setHTTPMethod:(NSString *)method;

設置請求體

  • (void)setHTTPBody:(NSData *)data;

設置請求頭

  • (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

創(chuàng)建GET和POST請求
注意:兩種不同請求的方式
創(chuàng)建GET請求
NSString *urlStr = [@"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

創(chuàng)建POST請求
NSString *urlStr = @"http://192.168.1.102:8080/MJServer/login";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
請求體
NSString *bodyStr = @"username=123&pwd=123";
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];

發(fā)送JSON給服務器
如何發(fā)送JSON給服務器
一定要使用POST請求
設置請求頭
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
設置JSON數(shù)據為請求體

多值參數(shù)
有時候一個參數(shù)名,可能會對應多個值
http://192.168.1.103:8080/MJServer/weather?place=北京&place=河南&place=湖南
服務器的place屬性是一個數(shù)組

*********************筆記************************


1.網絡基礎

  • 網絡基礎

001 問題:為什么要學習網絡編程棍弄?
回答:(1)網絡編程是一種實時更新應用數(shù)據的常用手段
(2)網絡編程是開發(fā)優(yōu)秀網絡應用的前提和基礎

002 網絡基本概念
2-1 客戶端(就是手機或者ipad等手持設備上面的APP)
2-2 服務器(遠程服務器-本地服務器)
2-3 請求(客戶端索要數(shù)據的方式)
2-4 響應(需要客戶端解析數(shù)據)
2-5 數(shù)據庫(服務器的數(shù)據從哪里來)

  • 3.2 Http

001 URL
1-1 如何找到服務器(通過一個唯一的URL)
1-2 URL介紹
a. 統(tǒng)一資源定位符
b. url格式(協(xié)議\主機地址\路徑)
協(xié)議:不同的協(xié)議望薄,代表著不同的資源查找方式、資源傳輸方式
主機地址:存放資源的主機(服務器)的IP地址(域名)
路徑:資源在主機(服務器)中的具體位置

1-3 請求協(xié)議
【file】訪問的是本地計算機上的資源呼畸,格式是file:(不用加主機地址)
【ftp】訪問的是共享主機的文件資源痕支,格式是ftp:
【mailto】訪問的是電子郵件地址,格式是mailto:
【http】超文本傳輸協(xié)議蛮原,訪問的是遠程的網絡資源卧须,格式是http:(網絡請求中最常用的協(xié)議)

002 http協(xié)議
2-1 http協(xié)議簡單介紹
a.超文本傳輸協(xié)議
b.規(guī)定客戶端和服務器之間的數(shù)據傳輸格式
c.讓客戶端和服務器能有效地進行數(shù)據溝通

2-2 http協(xié)議優(yōu)缺點
a.簡單快速(協(xié)議簡單,服務器端程序規(guī)模小,通信速度快)
b.靈活(允許傳輸各種數(shù)據)
c.非持續(xù)性連接(1.1之前版本是非持續(xù)的花嘶,即限制每次連接只處理一個請求笋籽,服務器對客戶端的請求做出響應后,馬上斷開連接椭员,這種方式可以節(jié)省傳輸時間)
2-3 基本通信過程
a.請求:客戶端向服務器索要數(shù)據
b.響應:服務器返回客戶端相應的數(shù)據

003 GET和POST請求
3-1 http里面發(fā)送請求的方法
GET(常用)车海、POST(常用)、OPTIONS隘击、HEAD侍芝、PUT、DELETE闸度、TRACE竭贩、CONNECT、PATCH

3-2 GET和POST請求的對比【區(qū)別在于參數(shù)如何傳遞】
GET
在請求URL后面以?的形式跟上發(fā)給服務器的參數(shù)莺禁,多個參數(shù)之間用&隔開留量,比如
http://ww.test.com/login?username=123&pwd=234&type=JSON
由于瀏覽器和服務器對URL長度有限制,因此在URL后面附帶的參數(shù)是有限制的哟冬,通常不能超過1KB

POST
發(fā)給服務器的參數(shù)全部放在請求體中
理論上楼熄,POST傳遞的數(shù)據量沒有限制(具體還得看服務器的處理能力)

3-3 如何選擇【除簡單數(shù)據查詢外,其它的一律使用POST請求】
a.如果要傳遞大量數(shù)據浩峡,比如文件上傳可岂,只能用POST請求
b.GET的安全性比POST要差些,如果包含機密\敏感信息翰灾,建議用POST
c.如果僅僅是索取數(shù)據(數(shù)據查詢)缕粹,建議使用GET
d.如果是增加、修改纸淮、刪除數(shù)據平斩,建議使用POST

004 iOS中發(fā)送http請求的方案
4-1 蘋果原生
NSURLConnection 03年推出的古老技術
NSURLSession 13年推出iOS7之后,以取代NSURLConnection【重點】
CFNetwork 底層技術咽块、C語言的

4-2 第三方框架
ASIHttpRequest
AFNetworking 【重點】
MKNetworkKit

005 http請求通信過程
5-1 請求
【包括請求頭+請求體·非必選】
5-2 響應
【響應頭+響應體】

5-3 通信過程
a.發(fā)送請求的時候把請求頭和請求體(請求體是非必須的)包裝成一個請求對象
b.服務器端對請求進行響應绘面,在響應信息中包含響應頭和響應體,響應信息是對服務器端的描述侈沪,具體的信息放在響應體中傳遞給客戶端

5-4 狀態(tài)碼
【200】:請求成功
【400】:客戶端請求的語法錯誤揭璃,服務器無法解析
【404】:無法找到資源
【500】:服務器內部錯誤,無法完成請求

2.NSURLConnection使用

  • 4.1 NSURLConnection同步請求(GET)

(1)步驟

01 設置請求路徑
02 創(chuàng)建請求對象(默認是GET請求亭罪,且已經默認包含了請求頭)
03 使用NSURLSession sendsync方法發(fā)送網絡請求
04 接收到服務器的響應后瘦馍,解析響應體

(2)相關代碼

1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];

2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];

3.把請求發(fā)送給服務器
sendSynchronousRequest 阻塞式的方法,會卡住線程

NSHTTPURLResponse *response = nil;
NSError *error = nil;

第一個參數(shù):請求對象
第二個參數(shù):響應頭信息皆撩,當該方法執(zhí)行完畢之后扣墩,該參數(shù)被賦值
第三個參數(shù):錯誤信息哲银,如果請求失敗扛吞,則error有值

該方法是阻塞式的呻惕,會卡住線程
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

3.解析服務器返回的數(shù)據
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

  • 3.2 NSURLConnection異步請求(GET-SendAsync)

(1)相關說明

01 該方法不會卡住當前線程,網絡請求任務是異步執(zhí)行的

(2)相關代碼

1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"];

2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];

3.把請求發(fā)送給服務器,發(fā)送一個異步請求

第一個參數(shù):請求對象
第二個參數(shù):回調方法在哪個線程中執(zhí)行滥比,如果是主隊列則block在主線程中執(zhí)行亚脆,非主隊列則在子線程中執(zhí)行
第三個參數(shù):completionHandlerBlock塊:接受到響應的時候執(zhí)行該block中的代碼
response:響應頭信息
data:響應體
connectionError:錯誤信息,如果請求失敗盲泛,那么該參數(shù)有值

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

4.解析服務器返回的數(shù)據

NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
轉換并打印響應頭信息
NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
}];

  • 3.3 NSURLConnection異步請求(GET-代理)
    (1)步驟

01 確定請求路徑
02 創(chuàng)建請求對象
03 創(chuàng)建NSURLConnection對象并設置代理
04 遵守NSURLConnectionDataDelegate協(xié)議濒持,并實現(xiàn)相應的代理方法
05 在代理方法中監(jiān)聽網絡請求的響應

(2)設置代理的幾種方法

設置代理的第一種方式:自動發(fā)送網絡請求
[[NSURLConnection alloc]initWithRequest:request delegate:self];

設置代理的第二種方式:
第一個參數(shù):請求對象
第二個參數(shù):誰成為NSURLConnetion對象的代理
第三個參數(shù):是否馬上發(fā)送網絡請求,如果該值為YES則立刻發(fā)送寺滚,如果為NO則不會發(fā)送網路請求
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

調用該方法控制網絡請求的發(fā)送
[conn start];

設置代理的第三種方式:使用類方法設置代理柑营,會自動發(fā)送網絡請求
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
取消網絡請求
[conn cancel];

(3)相關的代理方法

1.當接收到服務器響應的時候調用
第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
第二個參數(shù)response:接收到的服務器返回的響應頭信息

  • (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response

2.當接收到數(shù)據的時候調用,該方法會被調用多次
第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
第二個參數(shù)data:本次接收到的服務端返回的二進制數(shù)據(可能是片段)

  • (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data

3.當服務端返回的數(shù)據接收完畢之后會調用
通常在該方法中解析服務器返回的數(shù)據
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection

4.當請求錯誤的時候調用(比如請求超時)
第一個參數(shù)connection:NSURLConnection對象
第二個參數(shù):網絡請求的錯誤信息村视,如果請求失敗官套,則error有值

  • (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)
    (4)其它知識點

01 關于消息彈窗第三方框架的使用
SVProgressHUD
02 字符串截取相關方法

  • (NSRange)rangeOfString:(NSString *)searchString;

  • (NSString *)substringWithRange:(NSRange)range;

  • 4.4 NSURLConnection發(fā)送POST請求

(1)發(fā)送POST請求步驟

a.確定URL路徑
b.創(chuàng)建請求對象(可變對象)
c.修改請求對象的方法為POST,設置請求體(Data)
d.發(fā)送一個異步請求
e.補充:設置請求超時蚁孔,處理錯誤信息奶赔,設置請求頭(如獲取客戶端的版本等等,請求頭是可設置可不設置的)

(2)相關代碼

1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];

2.創(chuàng)建請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

2.1更改請求方法
request.HTTPMethod = @"POST";

2.2設置請求體
request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];

2.3請求超時
request.timeoutInterval = 5;

2.4設置請求頭
[request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];

3.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

4.解析服務器返回的數(shù)據
if (connectionError) {
    NSLog(@"--請求失敗-");
}else
{
    NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}

}];

  • 4.5 URL中文轉碼問題

1.確定請求路徑
NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it";
NSLog(@"%@",urlStr);
中文轉碼操作
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",urlStr);

NSURL *url = [NSURL URLWithString:urlStr];

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杠氢,隨后出現(xiàn)的幾起案子站刑,更是在濱河造成了極大的恐慌,老刑警劉巖鼻百,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绞旅,死亡現(xiàn)場離奇詭異,居然都是意外死亡温艇,警方通過查閱死者的電腦和手機因悲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來中贝,“玉大人囤捻,你說我怎么就攤上這事×谑伲” “怎么了蝎土?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绣否。 經常有香客問我誊涯,道長,這世上最難降的妖魔是什么蒜撮? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任暴构,我火速辦了婚禮跪呈,結果婚禮上,老公的妹妹穿的比我還像新娘取逾。我一直安慰自己耗绿,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布砾隅。 她就那樣靜靜地躺著误阻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晴埂。 梳的紋絲不亂的頭發(fā)上究反,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音儒洛,去河邊找鬼精耐。 笑死,一個胖子當著我的面吹牛琅锻,可吹牛的內容都是我干的卦停。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼浅浮,長吁一口氣:“原來是場噩夢啊……” “哼沫浆!你這毒婦竟也來了?” 一聲冷哼從身側響起滚秩,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤专执,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后郁油,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體本股,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年桐腌,在試婚紗的時候發(fā)現(xiàn)自己被綠了拄显。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡案站,死狀恐怖躬审,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蟆盐,我是刑警寧澤承边,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站石挂,受9級特大地震影響博助,放射性物質發(fā)生泄漏。R本人自食惡果不足惜痹愚,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一富岳、第九天 我趴在偏房一處隱蔽的房頂上張望蛔糯。 院中可真熱鬧,春花似錦窖式、人聲如沸蚁飒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飒箭。三九已至狼电,卻和暖如春蜒灰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肩碟。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工强窖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人削祈。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓翅溺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親髓抑。 傳聞我的和親對象是個殘疾皇子咙崎,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)吨拍,斷路器褪猛,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據格式,一般用于數(shù)據交互服務器返回給客戶端的數(shù)據...
    JonesCxy閱讀 1,857評論 2 10
  • 網絡基礎 Http: 蘋果原生: NSURLConnection 03年推出的古老技術 NSURLSession...
    木子尚武閱讀 291評論 0 0
  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,992評論 6 13
  • 小文件下載如果文件比較小羹饰,下載方式會比較多直接用NSData的+ (id)dataWithContentsOfUR...
    JonesCxy閱讀 665評論 0 1