iOS-網(wǎng)絡編程(網(wǎng)絡請求組件)

1 NSURLConnection網(wǎng)絡組件(iOS7之前的)

CFNetWork 是一種低層的高性能架構,它是基于BSD sockets的基礎上做了拓展,是全部網(wǎng)絡請求組件的父類

NSURLConnection網(wǎng)絡組件結構圖

2 NSURLSession網(wǎng)絡組件

iOS7之后,蘋果推出NSURLConnection 的繼任者:NSURLSession

NSURLSession網(wǎng)絡組件結構圖

NSURLSession網(wǎng)絡組件的使用流程
1.構造NSURL實例(鏈接地址)
2.構造NSURLRequest請求
3.構造NSURLSessionConfiguration(可選)
4.構造NSURLSession
5.構造NSURLSessionTask
6.構造NSURLSession發(fā)送請求

客戶端通過NSURLSession與服務器對話
  • 發(fā)送網(wǎng)絡的基本流程實例代碼:
    //1.????創(chuàng)建URL
    URLNSURL *URL = [NSURL URLWithString:@"http://example.com"];
    //2.創(chuàng)建request請求對象
    ????request????????NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    //3.創(chuàng)建URLSession對象
    ????URLSession????NSURLSession *session = [NSURLSession sharedSession];
    //4.????????????????????????設置數(shù)據(jù)返回回調(diào)的block
    ??NSURLSessionDataTask *task = [session dataTaskWithRequest:request
    completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
    //data是服務器返回的數(shù)據(jù)
    } ];
    //5.發(fā)送請求
    [task resume];

  • NSURLRequest

1 NSURLRequest 用于存儲客戶端發(fā)送給服務器的數(shù)據(jù)包信息和請求設置
2 NSURLRequest 只有很少的基本設置選項,我大部分使用其子類:NSMutableURLRequest

  • NSURLRequest示例代碼:

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    [request setURL:url];
    // 設置請求方式
    [request setHTTPMethod:@"POST"];
    //設置超時時間
    [request setTimeoutInterval:60];
    //設置請求體數(shù)據(jù)
    [request setHTTPBody:_data];
    //設置請求頭
    [request setValue:@“wxhl-ios" forHTTPHeaderField:@“cookes”];
    //設置緩存策略
    [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];

  • NSResponse

1 NSURLResponse用于存儲服務器返回的響應包數(shù)據(jù)
2 如果發(fā)送的是HTTP請求,那么使用其子類:NSHTTPURLResponse

NSResponse示例代碼:

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//響應的狀態(tài)碼
????????????NSInteger statusCode = httpResponse.statusCode;
//??????????響應頭信息
NSDictionary *allHeaderFields = httpResponse.allHeaderFields;
//取得響應頭中的信息項
????????????????????NSString *contentType = [allHeaderFields objectForKey:@“Content-Type"];
  • NSURLSession

1 NSURLSession 指的是一個網(wǎng)絡會話(Session),一個網(wǎng)絡會話可以發(fā)起多個任務(Task)
2 一個任務(Task)對應了一次網(wǎng)絡請求
3 Session的類型:

  • 默認類型的Session:使用持久化的,基于磁盤的緩存

  • 臨時的Session:不在磁盤存儲任何數(shù)據(jù),所有的緩存都存儲在內(nèi)存中

  • 后臺Session:和默認類型的Session很像,不同的是有一個獨立的進程處理所有網(wǎng)絡請求

  • NSURLSessionConfiguration

1 +defaultSessionConfiguration 用于創(chuàng)建默認類型的Session對象
2 +ephemeralSessionConfiguration 用于創(chuàng)建臨時類型的Session對象
3 +backgroundSessionConfiguration:(NSString *)identifier 用于創(chuàng)建后臺Session對象
4 NSURLSessionConfiguration 封裝了很多配置屬性,熟練配置這些屬性,可以讓網(wǎng)絡請求充分利用其網(wǎng)絡環(huán)境
requestCachePolicy :緩存策略
networkServiceType:網(wǎng)絡服務類型:網(wǎng)絡流量,網(wǎng)絡電話,語音,視頻
timeoutIntervalForRequest: 超時時間
HTTPAdditionalHeaders: 請求頭
discretionary: 用于后臺請求,會把WiFi和電量考慮在內(nèi).
allowsCellularAccess : 是否允許使用蜂窩數(shù)據(jù)

  • NSURLSessionConfiguration創(chuàng)建實例代碼:

      //1.創(chuàng)建session配置對象
      SessionNSURLSessionConfiguration       *sessionConfig =[NSURLSessionConfiguration defaultSessionConfiguration];
     //2.創(chuàng)建session對象
      SessionNSURLSession *session = [NSURLSession
    

sessionWithConfiguration:sessionConfig];

  • 網(wǎng)絡任務(NSURLSessionTask)
1 一個Session可以發(fā)起的多個網(wǎng)絡請求任務(Task)
2 三種類型的任務:(Task)
 1  數(shù)據(jù)任務(NSURLSessionDataTask):

數(shù)據(jù)任務擅長處理小且頻繁的應用程序與服務器之間的請求,
例如:請求JSON數(shù)據(jù),因為數(shù)據(jù)任務不會將數(shù)據(jù)存儲到磁盤文件中,所以不支持后臺Session
2 下載任務(NSURLSessionDownLoadTask):
以文件的形式接收數(shù)據(jù),可以在程序沒有運行時進行后臺下載
3 上傳任務(NSURLSessionUpLoadTask):
以文件的形式發(fā)送數(shù)據(jù),可以在程序沒有運行時進行后臺上傳

NSURLSessionTask的關系

3.1 實例代碼:
3.11. NSURLSessionDataTask 對象的創(chuàng)建都是通過Session對象的方法創(chuàng)建,創(chuàng)建任務代碼如下:

  • 通過 block回調(diào)監(jiān)聽網(wǎng)絡加載事件
    /** 通過request對象創(chuàng)建,RequestcompletionHandler:數(shù)據(jù)加載完成回調(diào)block*/

         NSURLSessionDataTask *task =  [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {       
    

    }];

     NSURLSessionDataTask *task =  [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {       
   
}];
  • 代理對象通過協(xié)議方法監(jiān)聽網(wǎng)絡事件
    NSURLSessionConfiguration *config = [NSURLSessionConfigurationdefaultSessionConfiguration];
    //設置代理
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configdelegate:self delegateQueue:mainQueue];

      //1.服務器返回響應頭信息,注意:響應頭中數(shù)據(jù)還沒完成
     - (void)URLSession:(NSURLSession *)session
     dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
     completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
    
      //2 響應體中的數(shù)據(jù)接收完成
      - (void)URLSession:(NSURLSession *)session
     dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    

3.1.2 上傳文件任務的創(chuàng)建:

// fileURL:上傳文件的路徑
 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest*)requestfromFile:(NSURL *)fileURLcompletionHandler:(void (^)(NSData *data, NSURLResponse *response,NSError *error))completionHandler

// fromDatadata:上傳文件的data
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest
*)requestfromData:(NSData *)bodyDatacompletionHandler:(void (^)(NSData *data, NSURLResponse *response,NSError *error))completionHandler

上傳任務請求網(wǎng)絡,請求包必須符合如下格式:

上傳文件的請求包必須符合的格式

3.1.3 下載任務的創(chuàng)建:

   // location
    - (NSURLSessionDownloadTask       *)downloadTaskWithRequest:(NSURLRequest*)requestcompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler

  - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)urlcompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler
  // resumeData: - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData
  *)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler

下載任務演示

  • 基本的下載任務
  • 下載任務的監(jiān)聽
  • 斷點續(xù)傳下載
  • 后臺下載
    ·在退出APP時,后臺的下載任務仍然進行中,一直到下載完成,重新進入APP時,才會觸發(fā)代理方法,拷貝文件
    ·在后臺如果沒有下載完成,重新進入APP時,下載任務會自動繼續(xù)
    上傳文件到微博
    參考發(fā)微博步驟:
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容