最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解

 更新時間:2017年02月13日 16:33:18   作者:總李寫代碼  
這篇文章主要介紹了IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解,今天使用NSURLConnection分別實現(xiàn)了get、post、表單提交、文件上傳、文件下載,有興趣的可以了解一下。

前言:

無論是Android還是ios都離不開與服務(wù)器交互,這就必須用到網(wǎng)絡(luò)請求,記得在2013年做iOS的時候那時候用的ASIHTTPRequest框架,現(xiàn)在重新?lián)炱餴OS的時候ASIHTTPRequest已經(jīng)停止維護,大家都在用AFNetWorking作為首選網(wǎng)絡(luò)請求框架,之前的ASIHTTPRequest是基于NSURLConnection類實現(xiàn)的,早期的AFNetWorking也是基于NSURLConnection實現(xiàn),后來iOS9 之后已經(jīng)放棄了NSURLConnection,開始使用iOS 7之后推出的NSURLSession,本著追根溯源的原則,首先學(xué)習(xí)一下NSURLSession的實現(xiàn)網(wǎng)絡(luò)請求,然后再去學(xué)習(xí)AFNetWorking。

了解NSURLSession

NSURLSession是2013年iOS 7發(fā)布的用于替代NSURLConnection的,iOS 9之后NSURLConnection徹底推出歷史舞臺。其使用起來非常方便,今天使用NSURLConnection分別實現(xiàn)了get、post、表單提交、文件上傳、文件下載,讓我這個以Android開發(fā)為主的程序員贊嘆不已,根據(jù)NSURLSession會話對象創(chuàng)建一個請求Task,然后執(zhí)行該Task即可,包括緩存、會話周期,多線程任務(wù)iOS都已經(jīng)在sdk層面封裝完畢,不過比較遺憾的時NSURLSession只提供了異步請求方式而沒有提供同步請求方式。接下來我們來如何實現(xiàn)網(wǎng)絡(luò)請求。

NSURLSession使用

我們首先以一個簡單的get請求為例開始。

1.)首先構(gòu)造一個NSURL請求資源地址

  // 構(gòu)造URL資源地址
  NSURL *url = [NSURL URLWithString:@http://api.nohttp.net/method?name=yanzhenjie&pwd=123];

2.)創(chuàng)建一個NSRequest請求對象

  // 創(chuàng)建Request請求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 配置Request請求
  // 設(shè)置請求方法
  [request setHTTPMethod:@"GET"];
  // 設(shè)置請求超時 默認超時時間60s
  [request setTimeoutInterval:10.0];
  // 設(shè)置頭部參數(shù)
  [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
  //或者下面這種方式 添加所有請求頭信息
  request.allHTTPHeaderFields=@{@"Content-Encoding":@"gzip"};
  //設(shè)置緩存策略
  [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

根據(jù)需求添加不用的設(shè)置,比如請求方式、超時時間、請求頭信息,這里重點介紹下緩存策略:

  • NSURLRequestUseProtocolCachePolicy = 0 //默認的緩存策略, 如果緩存不存在,直接從服務(wù)端獲取。如果緩存存在,會根據(jù)response中的Cache-Control字段判斷下一步操作,如: Cache-Control字段為must-revalidata, 則詢問服務(wù)端該數(shù)據(jù)是否有更新,無更新的話直接返回給用戶緩存數(shù)據(jù),若已更新,則請求服務(wù)端.
  • NSURLRequestReloadIgnoringLocalCacheData = 1 //忽略本地緩存數(shù)據(jù),直接請求服務(wù)端.
  • NSURLRequestIgnoringLocalAndRemoteCacheData = 4 //忽略本地緩存,代理服務(wù)器以及其他中介,直接請求源服務(wù)端.
  • NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
  • NSURLRequestReturnCacheDataElseLoad = 2 //有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無則請求服務(wù)端.
  •  NSURLRequestReturnCacheDataDontLoad = 3 //只加載本地緩存. 沒有就失敗. (確定當(dāng)前無網(wǎng)絡(luò)時使用)
  • NSURLRequestReloadRevalidatingCacheData = 5 //緩存數(shù)據(jù)必須得得到服務(wù)端確認有效才使用

3.)創(chuàng)建NSURLSession會話對象

可以通過采用iOS共享Session的方式

  // 采用蘋果提供的共享session
  NSURLSession *sharedSession = [NSURLSession sharedSession];

可以通過NSURLSessionConfiguration方式配置不同的NSURLSession

  // 構(gòu)造NSURLSessionConfiguration
  NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
  // 構(gòu)造NSURLSession,網(wǎng)絡(luò)會話;
  NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];

通過NSURLSessionConfiguration提供了三種創(chuàng)建NSURLSession的方式

  • defaultSessionConfiguration //默認配置使用的是持久化的硬盤緩存,存儲證書到用戶鑰匙鏈。存儲cookie到shareCookie。
  • ephemeralSessionConfiguration //不使用永久持存cookie、證書、緩存的配置,最佳優(yōu)化數(shù)據(jù)傳輸。
  • backgroundSessionConfigurationWithIdentifier //可以上傳下載HTTP和HTTPS的后臺任務(wù)(程序在后臺運行)。

在后臺時,將網(wǎng)絡(luò)傳輸交給系統(tǒng)的單獨的一個進程,即使app掛起、推出甚至崩潰照樣在后臺執(zhí)行。

也可以通過NSURLSessionConfiguration統(tǒng)一設(shè)置超時時間、請求頭等信息

  // 構(gòu)造NSURLSessionConfiguration
  NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
  //設(shè)置請求超時為10秒鐘
  configuration.timeoutIntervalForRequest = 10;
  
  //在蜂窩網(wǎng)絡(luò)情況下是否繼續(xù)請求(上傳或下載)
  configuration.allowsCellularAccess = NO;

  //配置請求頭
  configuration.HTTPAdditionalHeaders =@{@"Content-Encoding":@"gzip"};

4.) 創(chuàng)建NSURLSessionTask對象,然后執(zhí)行

  // 構(gòu)造NSURLSessionTask,會話任務(wù);
  NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    // 請求失敗,打印錯誤信息
    if (error) {
      NSLog(@"get error :%@",error.localizedDescription);
    }
    //請求成功,解析數(shù)據(jù)
    else {
      // JSON數(shù)據(jù)格式解析
      id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
      // 判斷是否解析成功
      if (error) {
        NSLog(@"get error :%@",error.localizedDescription);
      }else {
        NSLog(@"get success :%@",object);
        // 解析成功,處理數(shù)據(jù),通過GCD獲取主隊列,在主線程中刷新界面。
        dispatch_async(dispatch_get_main_queue(), ^{
          // 刷新界面....
        });
      }
    }
  }];

iOS為了適應(yīng)不同的應(yīng)用場景提供了不同類型的NSSessionTask

  • NSURLSessionDataTask  //一般的get、post等請求
  • NSURLSessionUploadTask // 用于上傳文件或者數(shù)據(jù)量比較大的請求
  • NSURLSessionDownloadTask //用于下載文件或者數(shù)據(jù)量比較大的請求
  • NSURLSessionStreamTask //建立一個TCP / IP連接的主機名和端口或一個網(wǎng)絡(luò)服務(wù)對象。

task的三個函數(shù)

  • - (void)suspend;//暫停
  • - (void)resume;//開始或者恢復(fù)
  • - (void)cancel;//關(guān)閉任務(wù)

NSURLSession其他請求示例

1.)post請求

  // 1、創(chuàng)建URL資源地址
  NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/postBody"];
  // 2、創(chuàng)建Reuest請求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 3、配置Request
  // 設(shè)置請求超時
  [request setTimeoutInterval:10.0];
  // 設(shè)置請求方法
  [request setHTTPMethod:@"POST"];
  // 設(shè)置頭部參數(shù)
  [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
  // 4、構(gòu)造請求參數(shù)
  // 4.1、創(chuàng)建字典參數(shù),將參數(shù)放入字典中,可防止程序員在主觀意識上犯錯誤,即參數(shù)寫錯。
  NSDictionary *parametersDict = @{@"name":@"yanzhenjie",@"pwd":@"123"};
  // 4.2、遍歷字典,以“key=value&”的方式創(chuàng)建參數(shù)字符串。
  NSMutableString *parameterString = [[NSMutableString alloc]init];
  int pos =0;
  for (NSString *key in parametersDict.allKeys) {
    // 拼接字符串
    [parameterString appendFormat:@"%@=%@", key, parametersDict[key]];
    if(pos<parametersDict.allKeys.count-1){
      [parameterString appendString:@"&"];
    }
    pos++;
  }
  // 4.3、NSString轉(zhuǎn)成NSData數(shù)據(jù)類型。
  NSData *parametersData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
  // 5、設(shè)置請求報文
  [request setHTTPBody:parametersData];
  // 6、構(gòu)造NSURLSessionConfiguration
  NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
  // 7、創(chuàng)建網(wǎng)絡(luò)會話
  NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
  // 8、創(chuàng)建會話任務(wù)
  NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    // 10、判斷是否請求成功
    if (error) {
      NSLog(@"post error :%@",error.localizedDescription);
    }else {
      // 如果請求成功,則解析數(shù)據(jù)。
      id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
      // 11、判斷是否解析成功
      if (error) {
        NSLog(@"post error :%@",error.localizedDescription);
      }else {
        // 解析成功,處理數(shù)據(jù),通過GCD獲取主隊列,在主線程中刷新界面。
        NSLog(@"post success :%@",object);
        dispatch_async(dispatch_get_main_queue(), ^{
          // 刷新界面...
        });
      }
    }
    
  }];
  // 9、執(zhí)行任務(wù)
  [task resume];

 2.)附帶表單參數(shù)文件上傳

  NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
  NSTimeInterval a=[dat timeIntervalSince1970];
  NSString* fileName = [NSString stringWithFormat:@"file_%0.f.txt", a];
  
  [FileUtils writeDataToFile:fileName data:[@"upload_file_to_server" dataUsingEncoding:NSUTF8StringEncoding]];
  
  // 以流的方式上傳,大小理論上不受限制,但應(yīng)注意時間
  // 1、創(chuàng)建URL資源地址
  NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/upload"];
  // 2、創(chuàng)建Reuest請求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 3、配置Request
  //設(shè)置Body值方法二,這種方法比較原始,不常用,不過可以用來上傳參數(shù)和文件
  NSString *BOUNDARY = @"whoislcj";//表單分界線 可以自定義任意值
  [request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  // 文件上傳使用post
  [request setHTTPMethod:@"POST"];
  // 設(shè)置請求超時
  [request setTimeoutInterval:30.0f];
  //用于存放二進制數(shù)據(jù)流
  NSMutableData *body = [NSMutableData data];
  
  //追加一個普通表單參數(shù) name=yanzhenjie
  NSString *nameParam = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",BOUNDARY,@"name",@"yanzhenjie",nil];
  [body appendData:[nameParam dataUsingEncoding:NSUTF8StringEncoding]];
  
  //追加一個普通表單參數(shù) pwd=123
  NSString *pwdParam = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",BOUNDARY,@"pwd",@"123",nil];
  [body appendData:[pwdParam dataUsingEncoding:NSUTF8StringEncoding]];
  
  //追加一個文件表單參數(shù)
  // Content-Disposition: form-data; name="<服務(wù)器端需要知道的名字>"; filename="<服務(wù)器端這個傳上來的文件名>"
  // Content-Type: application/octet-stream --根據(jù)不同的文件類型選擇不同的值
  NSString *file = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\";filename=\"%@\"\r\nContent-Type: application/octet-stream\r\n\r\n",BOUNDARY,@"headUrl",fileName,nil];
  [body appendData:[file dataUsingEncoding:NSUTF8StringEncoding]];
  //獲取file路徑
  NSString *filePath =[FileUtils getFilePath:fileName];
  NSData *data =[NSData dataWithContentsOfFile:filePath];
  //追加文件二進制數(shù)據(jù)
  [body appendData:data];
  [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
  //結(jié)束分割線
  NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY];
  [body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]];
  
  // 創(chuàng)建會話
  NSURLSession *session = [NSURLSession sharedSession];
  // 3.開始上傳  request的body data將被忽略,而由fromData提供
  NSURLSessionUploadTask *uploadTask= [session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error) {
      NSLog(@"upload error:%@",error);
    } else {
      NSLog(@"upload success:%@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]);
      dispatch_async(dispatch_get_main_queue(), ^{
        // 刷新界面...
      });
    }
  }];
  //執(zhí)行任務(wù)
  [uploadTask resume];

 3.)文件下載

// 創(chuàng)建url
  NSString *urlStr =@"http://images2015.cnblogs.com/blog/950883/201701/950883-20170105104233581-62069155.png";
  NSURL *Url = [NSURL URLWithString:urlStr];
  // 創(chuàng)建請求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:Url];
  // 設(shè)置請求超時
  [request setTimeoutInterval:30.0];
  // 創(chuàng)建會話
  NSURLSession *session = [NSURLSession sharedSession];
  
  NSURLSessionDownloadTask *downLoadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (!error) {
      NSLog(@"download sucess : %@", location);
      NSData *data=[NSData dataWithContentsOfURL:location];
      UIImage *image=[UIImage imageWithData:data];
      dispatch_async(dispatch_get_main_queue(), ^{
        // 刷新界面...
        UIImageView *imageView =[[UIImageView alloc]init];
        imageView.image=image;
        [self.view addSubview:imageView];
        [imageView mas_makeConstraints:^(MASConstraintMaker *make) {
          make.center.equalTo(self.view);
          make.size.mas_equalTo(CGSizeMake(300, 300));
        }];
      });
    } else {
      NSLog(@"download error : %@", error.localizedDescription);
    }
  }];
  //啟動任務(wù)
  [downLoadTask resume];

總結(jié):

今天學(xué)習(xí)了iOS底層如何實現(xiàn)網(wǎng)絡(luò)請求的,為了開發(fā)效率還得依靠優(yōu)秀的第三方開源框架,以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS NSTimer循環(huán)引用的辦法

    iOS NSTimer循環(huán)引用的辦法

    這篇文章主要介紹了iOS NSTimer循環(huán)引用的辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • iOS中程序異常Crash友好化處理詳解

    iOS中程序異常Crash友好化處理詳解

    在iOS開發(fā)調(diào)試過程中以及上線之后,程序經(jīng)常會出現(xiàn)崩潰的問題,下面這篇文章主要給大家介紹了關(guān)于iOS中程序異常Crash友好化處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • iOS使用CoreMotion實現(xiàn)搖一搖功能

    iOS使用CoreMotion實現(xiàn)搖一搖功能

    這篇文章主要為大家詳細介紹了iOS使用CoreMotion實現(xiàn)搖一搖功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • MacOS系統(tǒng)下Unity啟動黑屏的解決方法

    MacOS系統(tǒng)下Unity啟動黑屏的解決方法

    最近發(fā)現(xiàn)了一個問題,unity一打開就黑屏,通過查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于在MacOS系統(tǒng)下Unity啟動黑屏的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-01-01
  • 最新評論

    密云县| 吉水县| 哈密市| 九寨沟县| 婺源县| 阿瓦提县| 洛阳市| 陕西省| 武安市| 扶余县| 渑池县| 安乡县| 株洲县| 思南县| 彰化市| 白城市| 肥乡县| 清原| 新余市| 上栗县| 连江县| 宁陵县| 休宁县| 吕梁市| 巴楚县| 黑水县| 象州县| 吉林省| 本溪| 东源县| 石狮市| 财经| 玉屏| 蓝山县| 洮南市| 刚察县| 四川省| 丽水市| 沧州市| 黄梅县| 阳原县|