NEtWorking_四种数据请求方法

来源:互联网 发布:淘宝权和55开闹翻视频 编辑:程序博客网 时间:2024/05/18 10:44

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


0 0
原创粉丝点击