iOS网络请求NSURLConnection

注意事项:

1.如果网址中存在中文,进行URLEncode

NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];




一些理论知识:

1. GET请求和POST请求的区别

1.1 GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过?来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。

1.2 GET请求参数会出现在接口中,不安全。而POST请求相对安全。

1.3  虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。


2. 同步和异步的区别

同步链接: 主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序假死现象。

异步链接: 会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。


3.NSJSONSerializationoptions参数中几个参数的含义:

//    NSJSONReadingMutableContainers:返回可变容器,NSMutableDictionaryNSMutableArray

//    NSJSONReadingMutableLeaves:返回的JSON对象中字符串的值为NSMutableString

//    NSJSONReadingAllowFragments:允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON Fragment。例如使用这个选项可以解析 @“123” 这样的字符串。











1. 同步请求 GET

 // 设置请求路径

    NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list?uid=3&oid=1";

    NSURL *url = [NSURL URLWithString:urlStr];


    // 创建请求对象

    NSURLRequest *request = [NSURLRequest requestWithURL:url];


    // 发送请求

    // 发送同步请求,在主线程执行

    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    

    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

    NSLog(@"%@", dict);







2. 同步请求 POST

 // 设置请求路径

    NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list";

    NSURL *url = [NSURL URLWithString:urlStr];

    

    // 创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    

    // 创建参数字符串对象

    NSString *parmStr = @"uid=3&oid=1";

    

    // 将字符串转为NSData对象

    NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];

    

    // 设置请求体

    [request setHTTPBody:pramData];

    

    // 这是请求方式

    [request setHTTPMethod:@"POST"];

    

    // 创建同步链接

    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    

    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

    NSLog(@"%@", dict);








3. 异步请求 GET

3.1 block

// 设置请求路径

    NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list?uid=3&oid=1";

    NSURL *url = [NSURL URLWithString:urlStr];

    

    // 创建请求对象

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    

    // 发送请求

    // 发送异步请求

    // 创建一个队列(默认添加到该队列中的任务异步执行)

//    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    // 获取一个主队列

    NSOperationQueue *queue = [NSOperationQueue mainQueue];

    // 不管参数传入的是不是mainQueuesendAsynchronousRequest都是异步请求数据,传入的queuemainQueueblock中的代码是在主线程中完成,而传入的queue不是主线程时,则block中的代码则不是在主线程中完成

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"%@", dict);

}];








3.2 delegate

// 设置请求路径

    NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list?uid=3&oid=1";

    NSURL *url = [NSURL URLWithString:urlStr];

    

    // 创建请求对象

//    NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 默认就是GET请求

    // 设置请求超时

    // NSMutableURLRequestNSURLRequest的子类,常用的方法有:

    // 设置请求超时等待时间(超过这个时间就算超时,请求失败)-(void)seetTimeoutInterval:(NSTimeInterval)seconds;

    // 设置请求方法(比如GETPOST) -(void)setHTTPMethod:(NSString *)method;

    // 设置请求体 -(void)setHTTPBody:(NSData *)data;

    // 设置请求头 -(void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    request.timeoutInterval = 5.0;

    

    // 发送请求

    // 使用代理发送异步请求(通常应用于文件下载)

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];

    [connection start];


#pragma mark - NSURLConnectionDataDelegate

// 当接收到服务器的响应(连通了服务器)时会调用

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    NSLog(@"接收到服务器的响应 %i", [NSThread isMainThread]); // >> 主线程

    _allData = [NSMutableData data];

}


// 当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    NSLog(@"接收到服务器的数据 %i", [NSThread isMainThread]); // >> 主线程

    [_allData appendData:data];

}


// 当服务器的数据加载完毕时就会调用

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    NSLog(@"服务器的数据加载完毕 %i", [NSThread isMainThread]); // >> 主线程

    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_allData options:NSJSONReadingMutableContainers error:nil];

    NSLog(@"%@", dict);

}


// 请求错误的时候调用(请求超时、断网、没有网。一般指客户端错误)

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    NSLog(@“服务器数据请求失败 %i", [NSThread isMainThread]); // >> 主线程

}






4. 异步请求 POST

// 创建请求路径

    NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list";

    NSURL *url = [NSURL URLWithString:urlStr];

    

    // 创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    

    // 创建参数字符串对象

    NSString *parmStr = @"uid=3&oid=1";

    

    // 将字符串转成NSData对象

    NSData *parmData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];

    

    // 设置请求体

    [request setHTTPBody:parmData];

    

    // 设置请求方式

    [request setHTTPMethod:@"POST"];

    

    // 设置请求超时时间

    [request setTimeoutInterval:5];

    

    // 创建异步请求

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"%@", dict);

    }];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值