NSURLConnection的使用
- NSURL:請(qǐng)求地址
- NSURLRequest:一個(gè)NSURLRequest對(duì)象就代表一個(gè)請(qǐng)求晾腔,它包含的信息有灸眼;
- 一個(gè)NSURL對(duì)象
- 請(qǐng)求方法萌丈、請(qǐng)求頭、請(qǐng)求體
- 請(qǐng)求超時(shí)
- ...
- NSMutableURLRequest:NSURLRequest的子類
- NSURLConnection
- 負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接
- 發(fā)送數(shù)據(jù)給服務(wù)器渠缕,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)
NSURLConnection的使用步驟
- 創(chuàng)建一個(gè)NSURL對(duì)象,設(shè)置請(qǐng)求路徑
- 傳入NSURL創(chuàng)建一個(gè)NSURLRequest對(duì)象褒繁,設(shè)置請(qǐng)求頭和請(qǐng)求體
- 使用NSURLConnection發(fā)送請(qǐng)求
NSURLConnection發(fā)送請(qǐng)求
-
NSURLConnection常見(jiàn)的發(fā)送請(qǐng)求方法有以下幾種
-
同步請(qǐng)求 (該方法是阻塞式的亦鳞,會(huì)卡住線程)
+ (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * _Nullable * _Nullable)response error:(NSError **)error
-
-
異步請(qǐng)求:根據(jù)對(duì)服務(wù)器返回?cái)?shù)據(jù)的處理方式的不同,又可以分為2種
-
block回調(diào)
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* _Nullable response, NSData* _Nullable data, NSError* _Nullable connectionError)) handler
-
Delegate
// 1.0 + (nullable NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate // 2.0 - (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate startImmediately:(BOOL)startImmediately // 3.0 - (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate
-
在startImmediately = NO的情況下棒坏,需要調(diào)用start方法開(kāi)始發(fā)送請(qǐng)求
- (void)start;
需要遵守NSURLConnectionDataDelegate協(xié)議
-
-
NSURLConnectionDelegate
NSURLConnectionDataDelegate協(xié)議中的常用
的代理方法
//1.當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//2.接收到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候調(diào)用,(服務(wù)器返回的數(shù)據(jù)比較大時(shí)會(huì)調(diào)用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//3.當(dāng)請(qǐng)求失敗的時(shí)候調(diào)用(比如請(qǐng)求超時(shí))
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
//4.請(qǐng)求結(jié)束的時(shí)候調(diào)用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
NSMutableURLRequest
NSMutableURLRequest是NSURLRequest的子類燕差,常用
方法有
-
設(shè)置請(qǐng)求超時(shí)等待時(shí)間(超過(guò)這個(gè)時(shí)間就算超時(shí),請(qǐng)求失敯用帷)
@property NSTimeInterval timeoutInterval;
-
設(shè)置請(qǐng)求方法(比如GET和POST)
@property (copy) NSString *HTTPMethod;
-
設(shè)置請(qǐng)求體
@property (nullable, copy) NSData *HTTPBody;
-
設(shè)置請(qǐng)求頭
//如果先前已經(jīng)為該頭字段賦了值徒探,則該值將替換原來(lái)的值 - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field; /* 設(shè)置改屬性后,會(huì)對(duì)原有的請(qǐng)求頭+該屬性喂窟,進(jìn)行數(shù)據(jù)合并测暗, 如果兩者頭字段有沖突央串,則保留后者(該屬性)頭字段的值 */ @property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields; //如果先前為給定了頭字段,給定值附加到以前存在的值碗啄。適當(dāng)?shù)淖侄畏指舴ǘ禾?hào)) - (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
創(chuàng)建GET和POST請(qǐng)求
GET請(qǐng)求
-
NSURLConnection同步請(qǐng)求
sendAsynchronousRequest
方法
1. 設(shè)置請(qǐng)求路徑
2. 創(chuàng)建請(qǐng)求對(duì)象(默認(rèn)是GET請(qǐng)求质和,且已經(jīng)默認(rèn)包含了請(qǐng)求頭)
3. 使用NSURLConnection `sendSynchronousRequest`方法發(fā)送網(wǎng)絡(luò)請(qǐng)求
4. 該方法是阻塞式的方法,會(huì)卡住線程
5. 接收到服務(wù)器的響應(yīng)后稚字,解析響應(yīng)體
-
NSURLConnection異步請(qǐng)求(SendAsync)
sendAsynchronousRequest
方法
1. 設(shè)置請(qǐng)求路徑
2. 創(chuàng)建請(qǐng)求對(duì)象(默認(rèn)是GET請(qǐng)求饲宿,且已經(jīng)默認(rèn)包含了請(qǐng)求頭)
3. 使用NSURLConnection `sendAsynchronousRequest`方法發(fā)送網(wǎng)絡(luò)請(qǐng)求
4. 該方法不會(huì)卡住當(dāng)前線程,網(wǎng)絡(luò)請(qǐng)求任務(wù)是異步執(zhí)行的
5. 接收到服務(wù)器的響應(yīng)后胆描,解析響應(yīng)體
-
NSURLConnection異步請(qǐng)求(代理)
delegate
方法
1. 確定請(qǐng)求路徑
2. 創(chuàng)建請(qǐng)求對(duì)象
3. 創(chuàng)建NSURLConnection對(duì)象并設(shè)置代理(3種方式)
4. 遵守NSURLConnectionDataDelegate協(xié)議瘫想,并實(shí)現(xiàn)相應(yīng)的代理方法
5. 在代理方法中監(jiān)聽(tīng)網(wǎng)絡(luò)請(qǐng)求的響應(yīng)
備注:代理方法默認(rèn)在主線程中調(diào)用的,想要修改調(diào)用線程袄友,調(diào)用以下方法的方法:
//1. 設(shè)置代理方法在哪個(gè)線程中調(diào)用
- (void)setDelegateQueue:(nullable NSOperationQueue*) queue
//2. GCD + RunLoop配合使用
POST請(qǐng)求
POST的NSURLConnection請(qǐng)求方式與GET一樣(同步殿托、異步、代理)
1. 確定URL路徑
2. 創(chuàng)建請(qǐng)求對(duì)象(可變對(duì)象)
3. 修改請(qǐng)求對(duì)象的方法為POST剧蚣,設(shè)置請(qǐng)求體(Data)
4. 發(fā)送一個(gè)NSURLConnection請(qǐng)求
5. 補(bǔ)充:設(shè)置請(qǐng)求超時(shí)支竹,處理錯(cuò)誤信息,設(shè)置請(qǐng)求頭(如獲取客戶端的版本等信息,不設(shè)置就使用默認(rèn))
URL中文轉(zhuǎn)碼問(wèn)題
GET方式網(wǎng)絡(luò)請(qǐng)求時(shí)鸠按,請(qǐng)求路徑中可能有中文礼搁,會(huì)導(dǎo)致NSURL對(duì)象為null
,需要進(jìn)行中文轉(zhuǎn)碼操作
///中文轉(zhuǎn)碼操作
- (nullable NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc
具體代碼查看Github項(xiàng)目