Http是常用的一种网络协议,可以通过Get和Post两种方式请求数据。
在OC中可以通过使用NSURLConnection类来进行Http请求获取数据。然而这个类在iOS9.0以后官方就不推荐使用了,进而推荐的是NSURLSession。此外,iOS9.0以后会限制http请求,而改用更安全的https请求。
一个NSURLConnection对象可以加载指定的NSURL对象的内容。这个对象功能很少,主要用于控制异步加载URL请求内容的开始和结束。其提供很便捷的方法加载URL的内容,其中包括同步和使用回调块的异步方式。
如果想实现更好的控制效果,你可以创建一个带有遵循了NSURLConnectionDelegate
和NSURLConnectionDataDelegate
协议的委托对象的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";