NSURLConnection的Get\Post方法

习惯了用AFNetworking来处理网络请求,这次试试苹果源生控件的处理方式~~

 

#import "ViewController.h"

@interface ViewController () <NSURLConnectionDataDelegate>
@property (nonatomic, strong) NSMutableData *data;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setupView];
}

- (void)setupView
{
    [self connection];
}

- (void)connection
{
    NSString *urlStr = [NSString stringWithFormat:@"这里存放所需要的url"];
    
    //进行转码,以免中文乱码
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    //设置请求超时时间
    request.timeoutInterval = 10.0;
    
    [self sendAsyncOnBlock:request];
}

//发送get请求,用block回调
- (void)sendAsyncOnBlock:(NSMutableURLRequest *)request
{
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        //注意,这里回调block的线程,我是设置为主线程的。因为往往,在这里面,需要更新UI界面,而在iOS开发中,
        //更新UI界面必须在主线程中更新~~
        //
        //然后,解析json
        
        if (data){  //请求成功
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];   //解析数据
            
        }
        else{  //请求失败
            //返回的json数据为空
        }
    }];
}


//使用代理方式,发送get请求
- (void)sendAsyncOnDelegate:(NSMutableURLRequest *)request
{
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
}

//发送post请求
- (void)sendPostReq
{
    NSString *urlStr = [NSString stringWithFormat:@"这里存放所需要的url"];
    
    //进行转码,以免中文乱码
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    //设置为post请求
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];  //默认是get请求
    request.HTTPMethod = @"POST";
    request.timeoutInterval = 10.0;
    
    //通过请求头,告知服务器,客户端的类型
    [request setValue:@"ios" forHTTPHeaderField:@"User-Agent"];
    
    //设置请求体:(必须要设置,没有具体数据,不做示范)
//    NSString *param = [NSString stringWithFormat:];  
//    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
    
    //发送请求
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
    }];
}

#pragma mark -- NSURLConnectionDataDelegate

//当接受到服务器的响应(连通了服务器)就会调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.data = [[NSMutableData alloc] init];
}

//请求错误(失败)的时候调用(请求超时\断网\没有网, 一般指客户端错误)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    
}

//当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //在这里,当下载大文件资源时,是需要拼接数据的
    [self.data appendData:data];
}

//当服务器的数据接受完毕后就会调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    
}
@end

 

posted @ 2015-07-24 12:32  紫忆  阅读(369)  评论(0编辑  收藏  举报