1. 程式人生 > >iOS原生網路請求使用(NSURL,NSURLRequest/NSMutableURLRequest,NSURLConnection)

iOS原生網路請求使用(NSURL,NSURLRequest/NSMutableURLRequest,NSURLConnection)

在使用原生網路請求開發過程時,總是會使用到如下三個物件NSURL,NSURLRequest(NSMutableURLRequest),NSURLConnection。

訪問URL步驟
1、構造NSURL,,使用NSURL構造一個URL
2、生成一個NSURLRequest,使用NSURLRequest構造一個請求
3、通過NSURLConnection傳送請求,使用NSURLConnection傳送一個請求,並返回數
4、通過返回的NSURLResponse和NSError分析結果 ,使用NSURLResponse和NSError來監測響應和錯誤資訊

1、NSURL
NSURL是網路請求時需要用到的網路地址。
如何構造一個url,既有+方法,也有-方法
1-1、+方法

+ (id)URLWithString:(NSString *)URLString
+ (id)URLWithString:(NSString *)URLString relativeToURL: (NSURL *)baseURL
+ (id)fileURLWithPath:(NSString *)path isDirectory: (BOOL)isDir
+ (id)fileURLWithPath:(NSString *)path
1-2、-方法
- (id)initWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path
- (id)initWithString:(NSString *)URLString
- (id)initWithString:(NSString *)URLString relativeToURL:(NSURL *)baseURL
- (id)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
- (id)initFileURLWithPath:(NSString *)path
// 如
NSURL *urlHao123 = [NSURL URLWithString:@"http://www.hao123.com"];

2、NSURLRequest
封裝了一個針對某個URL的請求資訊,可以指明內容的快取策略構造URL請求。包括不可變請求NSURLRequest,或
可變請求NSMutableURLRequest。
2-1、不可變的請求NSURLRequest
2-1-1、+方法
+ (id)requestWithURL:(NSURL *)theURL
+ (id)requestWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: 
(NSTimeInter val)timeoutInterval
2-1-2、-方法
- (id)initWithURL:(NSURL *)theURL
- (id)initWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: 
(NSTimeInter val)timeoutInterval
 
2-2、可修改的URL請求NSMutableURLRequest
如果需要在初始化後仍能對URL請求物件進行修改,可以使用NSMutableURLRequest,可以修改的專案包括:
快取策略
超時時間
URL物件
主文件地址
頭資訊
上行內容 
請求方法
Cookie
2-3、支援的快取策略
NSURLRequestUseProtocolCachePolicy 
NSURLRequestReloadIgnoringLocalCacheData 
NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
NSURLRequestReloadIgnoringCacheData 
NSURLRequestReturnCacheDataElseLoad 
NSURLRequestReturnCacheDataDontLoad 
NSURLRequestReloadRevalidatingCacheData

3、NSURLConnection
傳送請求:可以使用同步或非同步的方式傳送一個請求,兩者的結果 返回內容不同
3-1、同步請求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse 
**)response error:(NSError **)error
最快捷的方式,但是不能監控內容下載過程
3-2、非同步請求
不影響當前正在進行操作 ,且請求回來的資料分多次按順序返回
3-2-1、程式碼塊非同步請求
+ (void)sendAsynchronousRequest:(NSURLRequest*) request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError));
3-2-2、代理方法非同步請求
非同步請求步驟:
3-2-2-1、構造連線物件(NSURLConnection)
+ (NSURLConnection *)connectionWithRequest: (NSURLRequest *)request delegate:(id)delegate
- (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate
- (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate startImmediately:(BOOL)startImmediately
3-2-2-2、傳送、停止請求
- (void)start
- (void)cancel
3-2-2-3、使用委託監控資料返回過程
// 請求開始
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
// 請求接收資料
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
// 請求完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
// 請求失敗
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
3-2-2-4、將多次返回的資料連線成同一個資料物件
3-2-2-5、使用連線後的資料物件

4、資料資訊處理
4-1、返回資料的處理
返回資料封裝以NSData,一般將其轉換為NSString後,才進行處理 
// NSString類中常用的轉換方法
- (id)initWithData:(NSData *)data encoding: (NSStringEncoding)encoding
或轉換成字典NSDictionary的JSON格式,才進行處理
// json的data轉換成dictionary
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

4-2、響應資訊的處理
4-2-1、NSURLResponse
NSURLRequest對應的響應的元資訊封裝在NSURLResponse中 
- (long long)expectedContentLength 
- (NSString *)suggestedFilename
- (NSString *)MIMEType
- (NSString *)textEncodingName 
- (NSURL *)URL
4-3、錯誤資訊的處理
NSError錯誤的處理,如果請求過程中發生錯誤,導致請求無法完成,則 error物件不為nil
- (NSString *)localizedDescription

5、支援協議: 
5-1、檔案傳輸協議(ftp://)
5-2、超文字傳輸協議(http://)
5-3、安全128-bit超文字傳輸協議(https://)
5-4、本地檔案路徑(file:///)