您的位置:首页 > 理论基础 > 计算机网络

iOS开发 ----- 网络请求2 ----- 请求数据

2015-09-26 18:56 681 查看

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];
// Do any additional setup after loading the view, typically from a nib.
//调用
[self getDataWithBlock];

}

-(void)getDataWithBlock
{
//请求的地址
NSString * path = @"http://10.0.8.8/sns/my/user_list.php";
//转为URL
NSURL * url = [NSURL URLWithString:path];
//初始化请求对象
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//初始化配置
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
//配置session
NSURLSession * session = [NSURLSession sessionWithConfiguration:config];
//初始化请求任务,以及请求完成之后要做的事
NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//解析JSON
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//打印
NSLog(@"%@",dict);

}];
//开始请求
[task resume];

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


1.2 GET –> delegate实现

和block请求方式类似,不过可以更加详细的看到相关的信息,如响应的头部信息,以及追加数据等等,相对block来说,会麻烦一点

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDataDelegate>

@end

@implementation ViewController
{
NSMutableData * _data;
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

[self getDataWithDelegate];

}

-(void)getDataWithDelegate
{
//初始化数据容器
_data                              = [[NSMutableData alloc]init];

//请求的地址
NSString * path                    = @"http://10.0.8.8/sns/my/user_list.php";
//转为URL
NSURL * url                        = [NSURL URLWithString:path];
//初始化请求对象
NSURLRequest * request             = [NSURLRequest requestWithURL:url];
//初始化配置
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
//配置session,指定代理
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];
// Dispose of any resources that can be recreated.
}

@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];
// Do any additional setup after loading the view, typically from a nib.

[self getDataWithBlock];

}

-(void)getDataWithBlock
{
//请求的地址
NSString * path = @"http://10.0.8.8/sns/my/user_list.php";
//转为URL
NSURL * url = [NSURL URLWithString:path];
//初始化请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
//设置为POST请求
request.HTTPMethod = @"POST";
//初始化配置
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
//配置session
NSURLSession * session = [NSURLSession sessionWithConfiguration:config];
//初始化请求任务,以及请求完成之后要做的事
NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSLog(@"%@",response);
//解析JSON
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//打印
NSLog(@"%@",dict);

}];
//开始请求
[task resume];

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@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];
// Do any additional setup after loading the view, typically from a nib.

[self getDataWithDelegate];

}

-(void)getDataWithDelegate
{
//初始化数据容器
_data                              = [[NSMutableData alloc]init];

//请求的地址
NSString * path                    = @"http://10.0.8.8/sns/my/user_list.php";
//转为URL
NSURL * url                        = [NSURL URLWithString:path];
//初始化请求对象
NSMutableURLRequest * request      = [NSMutableURLRequest requestWithURL:url];
//配置为post请求
request.HTTPMethod                 = @"POST";

//初始化配置
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
//配置session
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];
// Dispose of any resources that can be recreated.
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: