IOS网络请求之NSURLSession使用详解

2020-01-18 20:51:03王旭

task的三个函数

- (void)suspend;//暂停 - (void)resume;//开始或者恢复 - (void)cancel;//关闭任务

NSURLSession其他请求示例

1.)post请求


  // 1、创建URL资源地址
  NSURL *url = [NSURL URLWithString:@"http://www.easck.com/postBody"];
  // 2、创建Reuest请求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 3、配置Request
  // 设置请求超时
  [request setTimeoutInterval:10.0];
  // 设置请求方法
  [request setHTTPMethod:@"POST"];
  // 设置头部参数
  [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
  // 4、构造请求参数
  // 4.1、创建字典参数,将参数放入字典中,可防止程序员在主观意识上犯错误,即参数写错。
  NSDictionary *parametersDict = @{@"name":@"yanzhenjie",@"pwd":@"123"};
  // 4.2、遍历字典,以“key=value&”的方式创建参数字符串。
  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转成NSData数据类型。
  NSData *parametersData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
  // 5、设置请求报文
  [request setHTTPBody:parametersData];
  // 6、构造NSURLSessionConfiguration
  NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
  // 7、创建网络会话
  NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
  // 8、创建会话任务
  NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    // 10、判断是否请求成功
    if (error) {
      NSLog(@"post error :%@",error.localizedDescription);
    }else {
      // 如果请求成功,则解析数据。
      id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
      // 11、判断是否解析成功
      if (error) {
        NSLog(@"post error :%@",error.localizedDescription);
      }else {
        // 解析成功,处理数据,通过GCD获取主队列,在主线程中刷新界面。
        NSLog(@"post success :%@",object);
        dispatch_async(dispatch_get_main_queue(), ^{
          // 刷新界面...
        });
      }
    }
    
  }];
  // 9、执行任务
  [task resume];

 2.)附带表单参数文件上传


  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]];
  
  // 以流的方式上传,大小理论上不受限制,但应注意时间
  // 1、创建URL资源地址
  NSURL *url = [NSURL URLWithString:@"http://www.easck.com/upload"];
  // 2、创建Reuest请求
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  // 3、配置Request
  //设置Body值方法二,这种方法比较原始,不常用,不过可以用来上传参数和文件
  NSString *BOUNDARY = @"whoislcj";//表单分界线 可以自定义任意值
  [request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"];
  // 文件上传使用post
  [request setHTTPMethod:@"POST"];
  // 设置请求超时
  [request setTimeoutInterval:30.0f];
  //用于存放二进制数据流
  NSMutableData *body = [NSMutableData data];
  
  //追加一个普通表单参数 name=yanzhenjie
  NSString *nameParam = [NSString stringWithFormat:@"--%@rnContent-Disposition: form-data; name="%@"rnrn%@rn",BOUNDARY,@"name",@"yanzhenjie",nil];
  [body appendData:[nameParam dataUsingEncoding:NSUTF8StringEncoding]];
  
  //追加一个普通表单参数 pwd=123
  NSString *pwdParam = [NSString stringWithFormat:@"--%@rnContent-Disposition: form-data; name="%@"rnrn%@rn",BOUNDARY,@"pwd",@"123",nil];
  [body appendData:[pwdParam dataUsingEncoding:NSUTF8StringEncoding]];
  
  //追加一个文件表单参数
  // Content-Disposition: form-data; name="<服务器端需要知道的名字>"; filename="<服务器端这个传上来的文件名>"
  // Content-Type: application/octet-stream --根据不同的文件类型选择不同的值
  NSString *file = [NSString stringWithFormat:@"--%@rnContent-Disposition: form-data; name="%@";filename="%@"rnContent-Type: application/octet-streamrnrn",BOUNDARY,@"headUrl",fileName,nil];
  [body appendData:[file dataUsingEncoding:NSUTF8StringEncoding]];
  //获取file路径
  NSString *filePath =[FileUtils getFilePath:fileName];
  NSData *data =[NSData dataWithContentsOfFile:filePath];
  //追加文件二进制数据
  [body appendData:data];
  [body appendData:[@"rn" dataUsingEncoding:NSUTF8StringEncoding]];
  //结束分割线
  NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY];
  [body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]];
  
  // 创建会话
  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(), ^{
        // 刷新界面...
      });
    }
  }];
  //执行任务
  [uploadTask resume];