iOS-使用NSURLConnection进行Http Get和Post请求网络数据

Http是常用的一种网络协议,可以通过Get和Post两种方式请求数据。

  在OC中可以通过使用NSURLConnection类来进行Http请求获取数据。然而这个类在iOS9.0以后官方就不推荐使用了,进而推荐的是NSURLSession。此外,iOS9.0以后会限制http请求,而改用更安全的https请求。
  一个NSURLConnection对象可以加载指定的NSURL对象的内容。这个对象功能很少,主要用于控制异步加载URL请求内容的开始和结束。其提供很便捷的方法加载URL的内容,其中包括同步和使用回调块的异步方式。
  如果想实现更好的控制效果,你可以创建一个带有遵循了NSURLConnectionDelegateNSURLConnectionDataDelegate协议的委托对象的URL连接对象。这个连接会在使用异步加载数据时,向委托对象提供当前加载进度和状态。这些委托方法都是在初始化异步加载操作的同一个线程中被调用的。

解除iOS9.0显示http请求

在info.plist中增加以下字段:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

同步请求

GET请求方式可以看做是将需要传输的参数附加在url链接上进行网络请求。

NSMutableURLRequest *url = [[NSMutableURLRequest alloc] init];
url.URL = [NSURL URLWithString:@"http://www.baidu.com"];
url.HTTPMethod = @"GET";
//url.HTTPMethod = @"POST";
NSError *error;

//发送同步请求
NSData * data = [NSURLConnection sendSynchronousRequest:url returningResponse:nil error:&error];

if (!error) {
    NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
else
{
    NSLog(@"%@", error);
}

POST请求也很简单,只要把HTTPMethod属性改成@"POST"即可。

异步请求

NSMutableURLRequest *url = [[NSMutableURLRequest alloc] init];
url.URL = [NSURL URLWithString:@"http://www.baidu.com"];
url.HTTPMethod = @"GET";
//url.HTTPMethod = @"POST";
NSError *error;

//发送同步请求
[NSURLConnection sendAsynchronousRequest:url queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError)
{
    if (!error)
    {
        //成果获取数据
        NSLog(@"%@", response);
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
    else
    {
        NSLog(@"%@", error);
    }
}];

同理如果发送POST请求的话,还需要将需要传的参数设置为HTTPBody的值。当然还要注意字符编码问题!!!

url.HTTPBody = @"prama1=1&prama2=2";