iOS-進階整理05 - 網絡請求Session與Connection

一、網絡請求的基本知識

1.get方法與post方法
  1. get是從服務器上獲取數據,post是向服務器傳送數據。
  1. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應, 在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起 傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
  2. 對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request. Form獲取提交的數據。
    4.get是明文傳輸,post是轉為NSData

還是不明白,回頭再看這篇原創文章講了些post和get的問題,觀點有些不同http://www.nowamagic.net/librarys/veda/detail/1919這是400、500、301、200等網站狀態碼的含義
http://www.maolvge.cn/news/jianzhanchangshi/29.html2.

2.同步和異步

同步:提交請求->等待服務器處理->處理完畢返回
這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢session自己內部封裝了線程,不存在同步請求的問題了

3.NSURLConnection和NSURLConnection

iOS7以前,使用的都是NSURLConnection在WWDC2013中,推出了NSURLSession作為替代。下面這篇文章比較清楚地講了NSURLConnection和NSURLSession的一些區別和內容URLSession是一種任務模式iOS 7系列譯文:忘記NSURLConnection,擁抱NSURLSession吧!

4.設置Info.plist文件

添加一條App Transport Secutity Settings把其下的Allow Arbitrary Loads 屬性改為YES

二、使用NSURLConnection

1.get方法
//get的同步請求  
-(void)getAndSynchronize  
{  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    //得到網址  
    NSURL *url = [NSURL URLWithString:urlStr];  
    //創建請求  
    NSURLRequest *req = [NSURLRequest requestWithURL:url];  
    //創建同步鏈接  
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];  
      
    //json解析  
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
    NSLog(@"11%@",dic);        
}  
  
//get的異步請求,使用block方法  
-(void)getAndAsynchronize  
{  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    //得到網址  
    NSURL *url = [NSURL URLWithString:urlStr];  
    //創建請求  
    NSURLRequest *req = [NSURLRequest requestWithURL:url];  
      
    __block NSDictionary *dic = [NSDictionary dictionary];  
    //創建異步  
    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {  
      
        dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
        NSLog(@"%@",dic);  
    }];  
    NSLog(@"異步鏈接下面");  
}  
2.post方法同步請求
//post同步請求  
-(void)postAndSynchronize  
{  
    //post請求,一般只包含 協議://host/路徑  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    //得到網址  
    NSURL *url = [NSURL URLWithString:urlStr];  
    //請求方式為post,所有要創建為NSMutableURLRequest  
    NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url];  
    //設置情感方式,不設置時,默認為GET請求  
    [mReq setHTTPMethod:@"POST"];  
    //創建參數  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
    //設置參數  
    [mReq setHTTPBody:pData];  
      
    //建立同步鏈接  
    NSData *resultData = [NSURLConnection sendSynchronousRequest:mReq returningResponse:nil error:nil];  
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:resultData options:NSJSONReadingAllowFragments error:nil];  
    NSLog(@"%@",dic);  
} 

post方法,使用block和代理方式

//POST異步請求  
-(void)postAndAsynchronize  
{  
    NSString *str = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    NSURL *url = [NSURL URLWithString:str];  
    NSMutableURLRequest *mReq = [NSMutableURLRequest requestWithURL:url];  
    //cahce策略,超時time  
    NSMutableURLRequest *mReq1 = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];  
      
    [mReq setHTTPMethod:@"POST"];  
    //設置參數  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
    [mReq setHTTPBody:pData];  
      
    //1.block  
    __block NSDictionary *dic = [NSDictionary dictionary];  
    //建立異步鏈接  
    [NSURLConnection sendAsynchronousRequest:mReq queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {  
        dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
//        NSLog(@"%@",dic);  
    }];  
            
    //2.使用協議代理方法  
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:mReq delegate:self];  
}  
#pragma mark -- connect的異步代理方法  
  
//開始  
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
{  
    NSLog(@"開始相應,可以在此代理方法中初始化容器");  
    _mData = [[NSMutableData alloc]init];  
}    
//接收數據,data只是數據片段,不是完整數據,需要拼接  
-(void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data  
{  
    NSLog(@"開始返回數據片段");  
      
    [_mData appendData:data];  
}    
//本次鏈接完成  
-(void)connectionDidFinishLoading:(NSURLConnection *)connection  
{  
    NSLog(@"鏈接完成");  
    //可以在此解析數據  
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.mData options:NSJSONReadingAllowFragments error:nil];  
    NSLog(@"%@",dic);  
}  
  
//鏈接出錯  
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
{  
    NSLog(@"error - %@",error);  
}  

三、使用NSURLSession

1.在WWDC2013中,推出了NSURLSession作為替代。

支持后臺運行的網絡任務暫停、停止、重啟網絡任務、不再需要NSOpation封裝請求可以使用同樣的配置容器不同的session可以使用不同的私有存儲,block和代理可以同時起作用直接從文件系統上傳下載為了方便程序員使用,蘋果提供了一個全局session所有的任務(Task)都是由Session發起的所有的任務默認是掛起的,
需要ResumeNSURLSession的三種工作模式
默認會話模式(default)
瞬間會話模式(ephemeral)
不會有任何緩存后臺會話模式(background)
在后臺進行網絡請求,在沒有session以前使用gcd可以讓應用程序在進入后臺時繼續運行0分鐘支持三種任務加載瞬間,下載,上傳,父類都是NSURLSessionTaskNSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask1.session get block的方法

//session get block  
-(void)sessionGet  
{  
    //第一種方式創建session,單例,獲取全局session對象  
    NSURLSession *session = [NSURLSession sharedSession];  
  
    //第二種方式創建session,可以給session設置工作模式  
//    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];  
//    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];  
      
    //創建url對象  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/ 
    publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    //得到網址  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
//    //建立請求任務.block方式,通過url建立task,不需要建立request  
//    NSURLSessionDataTask *task = [session dataTaskWithURL:url   
      completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)   
      {  
//          
//        //解析數據  
//          
//    }];  
      
    //如果需要設置緩存策略、請求超時等,需要創建請求對象request  
    NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy   
                        timeoutInterval:30];  
      
    //通過request方式建立任務  
    NSURLSessionTask *task = [session dataTaskWithRequest:req   
        completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)   
   {  
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];  
        NSLog(@"%@",str);  
    }];        
    //啟動任務  
    [task resume];  
}
2.session get 代理方法

導入NSURLSessionDelegate,NSURLSessionDataDelegate協議


//session post delegate  
-(void)sessionDelegate  
{        
    //創建url對象  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    //得到網址  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
    //創建參數  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
      
    NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];  
    //設置請求超時  
    [mReq setTimeoutInterval:30];  
    [mReq setCachePolicy:NSURLRequestReloadIgnoringCacheData];  
    [mReq setHTTPMethod:@"POST"];  
    [mReq setHTTPBody:pData];  
      
    //代理的方法,主線程  
    NSURLSession *session_1 = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];  
      
    //創建任務(因為要使用代理方法,就不需要block方法初始化)  
    NSURLSessionDataTask *task_1 = [session_1 dataTaskWithRequest:mReq];  
    //啟動  
    [task_1 resume];  
}  
  
#pragma mark -- session delegate  
  
//服務器開始響應,準備返回數據  
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler  
{  
    //運行出來服務器的響應  
    completionHandler(NSURLSessionResponseAllow);  
    //當網絡請求是基于http協議的時候,response的本質為NSHTTPURLResponse  
//    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;  
      
    //初始化容器  
    _mData = [NSMutableData data];  
}  
  
//客戶端接收數據  
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data  
{  
    [_mData appendData:data];  
}  
  
//數據請求完成網絡請求成功,當error不為空,說明響應出錯  
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error  
{  
    if (error) {  
        NSLog(@"error -- %@",error);  
    }  
    else  
    {  
        NSString *str = [[NSString alloc]initWithData:_mData encoding:NSUTF8StringEncoding];  
        NSLog(@"delegate  -- %@",str);  
    }  
}  
3.session post方法 block
-(void)sessionPost  
{  
    //創建url對象  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    //得到網址  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
    //創建參數  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
    
    //創建request  
  NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url   
      cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];  
  
//設置   
    [mReq setHTTPMethod:@"POST"];   
    [mReq setHTTPBody:pData];   
//建session   
    NSURLSession *session = [NSURLSession sharedSession];   
//加載任務的數據對象   
    NSURLSessionTask *task = [session dataTaskWithRequest:mReqcompletionHandler:^  
   (NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)  
   {   
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];   
    NSLog(@"%@",str); }];   
  
//開啟任務   
    [task resume];   
}

緩存策略NSURLRequestCachePolicy

1> NSURLRequestUseProtocolCachePolicy = 0, 默認的緩存策略,如果緩存不存在,直接從服務端獲取。如果緩存存在,會根據response中的Cache-Control字段判斷下一步操作,如:Cache-Control字段為must-revalidata,則詢問服務端該數據是否有更新,無更新的話直接返回給用戶緩存數據,若已更新,則請求服務端.
2> NSURLRequestReloadIgnoringLocalCacheData = 1,忽略本地緩存數據,直接請求服務端.
3> NSURLRequestIgnoringLocalAndRemoteCacheData = 4,忽略本地緩存,代理服務器以及其他中介,直接請求源服務端.
4> NSURLRequestReloadIgnoringCacheData =NSURLRequestReloadIgnoringLocalCacheData
5> NSURLRequestReturnCacheDataElseLoad= 2, 有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無則請求服務端.
6> NSURLRequestReturnCacheDataDontLoad =3, 死活加載本地緩存. 沒有就失敗.(確定當前無網絡時使用)
7>NSURLRequestReloadRevalidatingCacheData =5, 緩存數據必須得得到服務端確認有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一種情況)Tips: URL Loading System默認只支持如下5中協議: 其中只有http://和https://才有緩存策略./(1) http://(2) https://(3) ftp://(4) file://(5) data://

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iOS開發系列--網絡開發 概覽 大部分應用程序都或多或少會牽扯到網絡開發,例如說新浪微博、微信等,這些應用本身可...
    lichengjin閱讀 3,707評論 2 7
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • 目錄 網絡基本概念 TCP/IP協議簇基本概念 HTTP 網絡開發技術解決方案 數據解析 網絡優化 1. 網絡基本...
    Ryan___閱讀 1,378評論 1 0
  • http協議有http0.9,http1.0,http1.1和http2三個版本,但是現在瀏覽器使用的是htt...
    一現_閱讀 1,892評論 0 3
  • 電影《撲通撲通我的人生》是一個關于早婚家庭的親情故事,日常生活中,這樣的故事或許并不易見,但類似兒童早衰這樣先天性...
    袁園園閱讀 310評論 2 2