网络请求

- NSURLSession

参考:NSURLSession的介绍和说明

  • 与NSURLConnection对比
    改进是可以配置每个session的缓存,协议,cookie以及credential policy。每个NSURLSession对象都是一个NSURLSessionConfiguration对象来进行初始化,指定那些策略和增强移动设备上性能选项。

  • NSURLSessionTask
    负责处理数据的加载以及文件和数据在客户端与服务器之间的上传和下载。3个子类NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask可以直接使用。这三个子类完成最基本的网络任务,获取JSON或XML数据,上传和下载文件。
    所有task都是可以取消,暂停或恢复的。当download task取消时,可以通过选项创建一个resume data传递给下一次新创建的download task继续download

  • session创建方式

//1.不需要配置网络属性,用这种就可以
 NSURLSession *session = [NSURLSession sharedSession];
//2.需要配置网络属性
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
  • get 请求
NSURL *URL = [NSURL URLWithString:@"http://example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
//
 NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
          completionHandler:
     ^(NSData *data, NSURLResponse *response, NSError *error) {
          // ...
     }];
[task resume];
  • post
// 1.创建一个网络路径
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://172.16.2.254/php/phonelogin"]];
// 2.创建一个网络请求,分别设置请求方法、请求参数
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSString *args = [NSString stringWithFormat:@"yourname=%@&yourpass=%@&btn=login",yourname,yourpass];
request.HTTPBody = [args dataUsingEncoding:NSUTF8StringEncoding];
// 3.获得会话对象
NSURLSession *session = [NSURLSession sharedSession];
// 4.根据会话对象,创建一个Task任务
NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"从服务器获取到数据");
/*
对从服务器获取到的数据data进行相应的处理.
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableLeaves) error:nil];
}];
//5.最后一步,执行任务,(resume也是继续执行)。
[sessionDataTask resume];
  • 上传NSData
    NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSData *data = ...;
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler:
    ^(NSData *data, NSURLResponse *response, NSError *error) {
    // ...
    }];
    [uploadTask resume];
  • 下载
    NSURL *URL = [NSURL URLWithString:@"http://example.com/file.zip"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:
    ^(NSURL *location, NSURLResponse *response, NSError *error) {
    //...
    }];
    [downloadTask resume];
  • NSURLSession的delegate方法
    可以不使用block形式,使用代理,resume同样要调用
  • NSURLSessionConfiguration
    可以找到任何你想要进行配置的选项。包括可用网络,cookie,安全性,缓存策略,自定义协议,启动事件的设置,移动设备优化。
    • 设置请求的header,跨session共享信息如内容类型,语言,User agent和Author。
      configuration.HTTPAdditionalHeaders= @{@"Accept": @"application/json",
      @"Accept-Language": @"en",
      @"Authorization": authString,
      @"User-Agent": userAgentString};
    • 设置超时时间 configuration.timeoutIntervalForRequest = 30.0;
    • 缓存策略(请求过就不会再请求了):
      configuration.requestCachePolicy=NSURLRequestReturnCacheDataElseLoad;

AFNetWorking 上传图片

{
            AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
            manager.responseSerializer = [AFHTTPResponseSerializer serializer];
            [manager POST:urlString parameters:nil constructingBodyWithBlock:^(id formData) {
                //file :是后台接受图片的参数名,上传多张图片则可以写成:file1 ,file2,file3...
                [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5) name:@"file" fileName:@"test.jpg" mimeType:@"image/jpg"];
            } success:^(NSURLSessionDataTask *task, id responseObject) {
                NSLog(@"success");
            } failure:^(NSURLSessionDataTask *task, NSError *error) {
                NSLog(@"%@",error);
            }];
        }

你可能感兴趣的:(网络请求)