NSURLSession请求数据
系列导航
网络请求1 —> 概览
网络请求2 —> 请求数据
网络请求3 —> 上传数据
网络请求4 —> 下载数据以及断点续传
前边BB了那么多,下边该看看应该怎么实现了,分为GET请求和POST请求,然后用分别用代理和block来实现,也就是说将有4段程序,截图就不贴了,每什么好截的,控制台打印,数据明明白白的
1.GET
1.1 GET –> block实现
必须调用resume方法,否则不会请求 所谓的block也就是在下边completionHandler这个block中编写请求数据的处理,是要存储模型还是干什么
代码部分
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self getDataWithBlock];
}
-(void)getDataWithBlock
{
NSString * path = @"http://10.0.8.8/sns/my/user_list.php";
NSURL * url = [NSURL URLWithString:path];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession * session = [NSURLSession sessionWithConfiguration:config];
NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}];
[task resume];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
1.2 GET –> delegate实现
和block请求方式类似,不过可以更加详细的看到相关的信息,如响应的头部信息,以及追加数据等等,相对block来说,会麻烦一点
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
{
NSMutableData * _data;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self getDataWithDelegate];
}
-(void)getDataWithDelegate
{
_data = [[NSMutableData alloc]init];
NSString * path = @"http://10.0.8.8/sns/my/user_list.php";
NSURL * url = [NSURL URLWithString:path];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession * session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask * task = [session dataTaskWithRequest:request];
[task resume];
}
#pragma mark -- 收到响应时候所做的事情
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
NSLog(@"%@",response);
completionHandler(NSURLSessionResponseAllow);
}
#pragma mark -- 收到数据时调用的方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
[_data appendData:data];
}
#pragma mark -- 请求完成时候调用的方法
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
if (error) {
NSLog(@"%@",error);
}else
{
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
2.POST
2.1 POST –> block实现
多了一点,request转为可变的,然后配置为POST即可,其他方式等同于GET请求
POST多了以点加密的功能,POST提交的数据时不可见的,所以,相对来说,性能上会损失一点
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
{
NSMutableData * _data;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self getDataWithBlock];
}
-(void)getDataWithBlock
{
NSString * path = @"http://10.0.8.8/sns/my/user_list.php";
NSURL * url = [NSURL URLWithString:path];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession * session = [NSURLSession sessionWithConfiguration:config];
NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"%@",response);
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}];
[task resume];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
2.2 POST –>代理方式
和GET几乎是一样的,多了一点,request转为可变的,然后配置为POST即可,其他方式等同于GET请求
POST多了以点加密的功能,POST提交的数据时不可见的,所以,相对来说,性能上会损失一点
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
{
NSMutableData * _data;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self getDataWithDelegate];
}
-(void)getDataWithDelegate
{
_data = [[NSMutableData alloc]init];
NSString * path = @"http://10.0.8.8/sns/my/user_list.php";
NSURL * url = [NSURL URLWithString:path];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession * session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask * task = [session dataTaskWithRequest:request];
[task resume];
}
#pragma mark -- 收到响应时候所做的事情
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
NSLog(@"%@",response);
completionHandler(NSURLSessionResponseAllow);
}
#pragma mark -- 收到数据时调用的方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
[_data appendData:data];
}
#pragma mark -- 请求完成时候调用的方法
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
if (error) {
NSLog(@"%@",error);
}else
{
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dict);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end