一、数据请求
步骤
- 确定请求路径,获得URL
- 创建请求对象(默认请求头和请求方法为GET,如果是POST请求需修改为post)
- 创建请求会话
- 根据会话对象创建请求任务
- 执行task
- 解析回调数据
- 注意配置info文件
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]);
}