NSURLConnection的使用
- NSURL:請求地址
- NSURLRequest:一個NSURLRequest對象就代表一個請求,它包含的信息有;
- 一個NSURL對象
- 請求方法、請求頭、請求體
- 請求超時
- ...
- NSMutableURLRequest:NSURLRequest的子類
- NSURLConnection
- 負責發送請求,建立客戶端和服務器的連接
- 發送數據給服務器,并收集來自服務器的響應數據
NSURLConnection的使用步驟
- 創建一個NSURL對象,設置請求路徑
- 傳入NSURL創建一個NSURLRequest對象,設置請求頭和請求體
- 使用NSURLConnection發送請求
NSURLConnection發送請求
-
NSURLConnection常見的發送請求方法有以下幾種
-
同步請求 (該方法是阻塞式的,會卡住線程)
+ (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * _Nullable * _Nullable)response error:(NSError **)error
-
-
異步請求:根據對服務器返回數據的處理方式的不同,又可以分為2種
-
block回調
+ (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的情況下,需要調用start方法開始發送請求
- (void)start;
需要遵守NSURLConnectionDataDelegate協議
-
-
NSURLConnectionDelegate
NSURLConnectionDataDelegate協議中的常用
的代理方法
//1.當接收到服務器響應的時候調用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//2.接收到服務器返回數據的時候調用,(服務器返回的數據比較大時會調用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//3.當請求失敗的時候調用(比如請求超時)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
//4.請求結束的時候調用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
NSMutableURLRequest
NSMutableURLRequest是NSURLRequest的子類,常用
方法有
-
設置請求超時等待時間(超過這個時間就算超時,請求失敗)
@property NSTimeInterval timeoutInterval;
-
設置請求方法(比如GET和POST)
@property (copy) NSString *HTTPMethod;
-
設置請求體
@property (nullable, copy) NSData *HTTPBody;
-
設置請求頭
//如果先前已經為該頭字段賦了值,則該值將替換原來的值 - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field; /* 設置改屬性后,會對原有的請求頭+該屬性,進行數據合并, 如果兩者頭字段有沖突,則保留后者(該屬性)頭字段的值 */ @property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields; //如果先前為給定了頭字段,給定值附加到以前存在的值。適當的字段分隔符(逗號) - (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
創建GET和POST請求
GET請求
-
NSURLConnection同步請求
sendAsynchronousRequest
方法
1. 設置請求路徑
2. 創建請求對象(默認是GET請求,且已經默認包含了請求頭)
3. 使用NSURLConnection `sendSynchronousRequest`方法發送網絡請求
4. 該方法是阻塞式的方法,會卡住線程
5. 接收到服務器的響應后,解析響應體
-
NSURLConnection異步請求(SendAsync)
sendAsynchronousRequest
方法
1. 設置請求路徑
2. 創建請求對象(默認是GET請求,且已經默認包含了請求頭)
3. 使用NSURLConnection `sendAsynchronousRequest`方法發送網絡請求
4. 該方法不會卡住當前線程,網絡請求任務是異步執行的
5. 接收到服務器的響應后,解析響應體
-
NSURLConnection異步請求(代理)
delegate
方法
1. 確定請求路徑
2. 創建請求對象
3. 創建NSURLConnection對象并設置代理(3種方式)
4. 遵守NSURLConnectionDataDelegate協議,并實現相應的代理方法
5. 在代理方法中監聽網絡請求的響應
備注:代理方法默認在主線程中調用的,想要修改調用線程,調用以下方法的方法:
//1. 設置代理方法在哪個線程中調用
- (void)setDelegateQueue:(nullable NSOperationQueue*) queue
//2. GCD + RunLoop配合使用
POST請求
POST的NSURLConnection請求方式與GET一樣(同步、異步、代理)
1. 確定URL路徑
2. 創建請求對象(可變對象)
3. 修改請求對象的方法為POST,設置請求體(Data)
4. 發送一個NSURLConnection請求
5. 補充:設置請求超時,處理錯誤信息,設置請求頭(如獲取客戶端的版本等信息,不設置就使用默認)
URL中文轉碼問題
GET方式網絡請求時,請求路徑中可能有中文,會導致NSURL對象為null
,需要進行中文轉碼操作
///中文轉碼操作
- (nullable NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc
具體代碼查看Github項目