您的位置:首页 > 其它

NEtWorking_四种数据请求方法

2015-09-15 20:59 267 查看
ViewController.m

#import "ViewController.h"

@interface ViewController ()<NSURLConnectionDataDelegate>

//用来拼接数据
@property (nonatomic,strong) NSMutableData * appendData;

@end

@implementation ViewController

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

/*
同步和异步的区别
同步:主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。所以这个时候的所有请求将会在服务端得到同步
异步:指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就象是一个请求队列,所有的动作在这里不会得到同步的。
*/
/*
get和post区别:
get会显示所有信息,在URL上显示
post会把信息放在一个body里,看不见(但只是所谓的安全,最好的安全师抓到包(获取信息)也没有用)

*/

#pragma mark -- 一下四个都是button点击事件

//get同步(不常用)
//容易出现假死现象(不能进行任何操作)
-(IBAction)getSync:(id)sender {
NSLog(@"get同步");

//    1.准备url(全国统一定位符)
//    这个string是地址
//    ? 的后面是参数,用 & 隔开; = 前面是变量名,后面是参数(可改变)
NSString * urlStr = @"http://172.21.8.5/?userName=yan3&password=123";
NSURL * url = [NSURL URLWithString:urlStr];

//    2.创建请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30];

//    设置
//    默认就是GET
[request setHTTPMethod:@"GET"];

//    3.创建响应对象(目的接收响应)
//    这里没必要创建值,因为请求回来是会给他一个值
NSURLResponse * response = nil;

//    4.创建错误对象
NSError * error = nil;

//    5.发送请求,建立连接,接收(数据 || 响应 || 错误)
//    巨大问题:有可能出现假死现象:所有UI程序停下来等他响应完成
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

NSLog(@"data : %@",data);
NSLog(@"response : %@",response);
NSLog(@"error : %@",error);

}

//get异步(一定要掌握)
- (IBAction)getAsyn:(id)sender {
NSLog(@"get异步");

//    1.准备url
NSString * urlStr = @"http://172.21.8.5/?userName=yan3&password=123";
NSURL * url = [NSURL URLWithString:urlStr];

//    2.创建请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];

//    异步不需要创建响应和错误
//    3.发送请求建立连接(代理)
NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];

//    4.启动
[conn start];

//    5.取消(不要在这写)
//    [conn cancel];
}

//post同步
- (IBAction)postSync:(id)sender {
NSLog(@"post同步");
//    1.准备url
//    这的参数就不要了,写在下面3.
NSString * urlStr = @"http://172.21.8.5/";
NSURL * url = [NSURL URLWithString:urlStr];

//    2.准备请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

//    3.准备参数
NSString * paramStr = [NSString stringWithFormat:@"userName=yan3&password=123"];
//    将参数转换成NSData类型
NSData * paramData = [paramStr dataUsingEncoding:NSUTF8StringEncoding];

//    添加参数
[request setHTTPBody:paramData];

//    4.发送请求,建立连接
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSLog(@"data:%@",data);

//    5.解析
//    崩溃信息:reason: 'data parameter is nil'  (说明接收到空信息,但是又解析了)
//    id temp = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
//    加这些判断,可以减少程序蹦的概率
if (data != nil) {
id temp = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"%@",temp);
}else{
NSLog(@"网络故障,没有数据");
}
}

//post异步(一定要掌握)
- (IBAction)postAsyn:(id)sender {
NSLog(@"post异步");

//    1.准备URL
NSString * urlStr = @"http://172.17.32.53/";
NSURL * url = [NSURL URLWithString:urlStr];

//    2.创建请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30];
//    post类型的请求
[request setHTTPMethod:@"POST"];

//    3.准备参数
NSString * paramStr = @"userName=yan3&password=123";
//    转换成NSData类型
//    转成NSUTF8这种格式
NSData * paramData = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:paramData];

//    4.发送请求,建立连接 (get异步也可以用这个)
//    queue:[NSOperationQueue mainQueue] 是个操作队列,跟多线程有关
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
}];

NSLog(@"%@",paramData);
}

//只有get异步用

#pragma mark --  NSURLConnectionDataDelegate 协议方法
//1.已经接收到响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

//    马上开始传数据了
//    response中包含了数据信息

//    初始化
_appendData = [NSMutableData data];

}

//2.接收到数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

//这个数据不是一次性传完.这个方法会走多次
// 我们要将data拼接起来

[self.appendData appendData:data];
}

// 3 数据接收完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//接收好数据,处理。
//解析(异步get)
//将接收到的数据转换为字符串类型的,然后输出
NSString * receiveStr = [[NSString alloc]initWithData:self.appendData encoding:NSUTF8StringEncoding];
NSLog(@"%@",receiveStr);
}

// 4 请求发生错误
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"%@",[error localizedDescription]);
}

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

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