NSURLSession的使用 | 青训营笔记

115 阅读3分钟

一、数据请求

步骤

  • 确定请求路径,获得URL
  • 创建请求对象(默认请求头和请求方法为GET,如果是POST请求需修改为post)
  • 创建请求会话
  • 根据会话对象创建请求任务
  • 执行task
  • 解析回调数据
  • 注意配置info文件

image.png

1、GET请求

1、确定请求路径

NSURL *url = [NSURL URLWithString:@"http: *//127.0.0.1/AF_Hello_Get.php?name=jack&password=123*"];

2、创建请求对象

NSURLRequest *request = [NSURLRequest requestWithURL:url];

3、获得会话对象

NSURLSession *session = [NSURLSession sharedSession];

4、根据会话对象创建一个Task,有两种Get请求方法 第一种

NSURLSessionDataTask *firsttask = [session dataTaskWithURL:url completionHandler:^(NSData *_Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error){ NSlog(@"%@",data);

/*第一个参数session:请求对象 第二个参数:conmpletionHandler回调 data:响应体(期望得到的数据) response:响应头信息,对服务器的描述 error:错误信息,请求成功为nil/

第二种

NSURLSessionDataTask *secondtask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"Get请求返回的响应信息:%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]); }];

5、执行任务

[firsttask resume];

2、POST请求

1、确定请求路径

NSURL *url = [NSURL URLWithString:@"http: *//127.0.0.1/AF_Hello_Get.php?name=jack&password=123*"];

2、创建可变的请求对象

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

3、修改请求方法为POST

request.HTTPMethod = @"POST";

4、设置请求体

request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];

5、创建会话对象

NSURLSession *session_post = [NSURLSession sharedSession];

6、根据对象创建一个Task /*data:响应体信息(期望的数据)response:响应头信息,主要是对服务器端的描述 error:错误信息,如果请求失败,则error有值/

NSURLSessionDataTask *dataTask = [session_post dataTaskWithRequest:request_post completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //解析数据 
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; NSLog(@"%@",dict); }];

8、执行任务 [dataTask resume];

二、使用代理方法请求

需要监听网络请求的过程,那么就需要用到代理方法

  • 遵从协议,设置代理
@interface ViewController () <NSURLSessionDataDelegate>
/**存放接受的信息*/
@property(nonatomic, strong) NSMutableData *mData;
@end
  • 确定请求路径,创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
  • 配置会话对象,设置代理
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; //defaultSessionConfiguration表示默认配置 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

//delegate:代理对象,此为控制器本身 //delegataQueue:队列,决定代理方法在哪个线程调用 //[NSOperationQueue mainQueue] 主队列 //[[NSOperationQueue alloc]init] 非主队列,开辟子线程

  • 根据会话对象创建一个Task(发送请求)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; 
  • 执行任务
[task resume];

代理方法

1.接收到服务器响应的时候调用该方法

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    
    //如果需要知道这个HTTP的所有信息,就需要获得NSURLResponse的子类
    NSHTTPURLResponse *htttpResponse = (NSHTTPURLResponse *)response;
    
    //打印信息
    NSLog(@"响应头信息:%@",htttpResponse.allHeaderFields);

    //定义一个容器用于接受服务器返回的数据
    self.mData = [NSMutableData data];
    
    //默认是取消的(NSURLSessionResponseCancel),继续传递数据(NSURLSessionResponseAllow) 
    completionHandler(NSURLSessionResponseAllow);
}

2.接收到服务器返回数据的时候会调用该方法,如果数据较大那么该方法可能会调用多次

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    //拼接服务器返回的数据
    [_mData appendData:data];
}

3.当请求完成(成功|失败)的时候会调用该方法,如果请求失败,则error有值

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
  
  NSLog(@"代理方法返回的响应信息:%@",[NSJSONSerialization JSONObjectWithData:_mData options:kNilOptions error:nil]);
}