iOS开发之网络编程:9-常用网络内部类之NSURLConnection
在iOS9后,NSURLConnection相关方法被完全的弃用,iOS系统有向下兼容的特性,尽管NSURLConnection已经被弃用,但在开发中,其方法依然可以被使用,如果需要兼容到很低版本的iOS系统,我们就必须使用NSURLConnection类了。
1、NSURLConnection常用类
NSURL:请求地址
NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体等
NSMutableURLRequest:NSURLRequest的子类,当URL会变化时,就要用它。
NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送数据给服务器,并收集来自服务器的响应数据。
2、NSURLConnection的使用步骤
以使用POST请求为例,从聚合数据获取一些数据,做个简单介绍。
- 获取请求网址
NSURL *url = [NSURL URLWithString:@"http://v.juhe.cn/weixin/query?"];
- 封装请求,这里的request是可变的,重要数据会在保密后接在url上。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
- 设置请求方式
[request setHTTPMethod:@"POST"];
- 设置请求体(会把请求的数据转成data,达到用户信息保密的目的),APPKEY加到对应位置。
NSData *data = [@"key=您申请的KEY" dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
- 发送请求
NSURLResponse *response = nil;
NSError *error = nil;
NSData *content = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
- 获取数据
NSError *newError = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:content options:NSJSONReadingMutableContainers error:&newError];
NSDictionary *dict = dictionary[@"result"];
NSArray *arr = dict[@"list"];
NSDictionary *dic = arr[2];
NSLog(@"%@",dic[@"title"]);
运行效果:
- 还可以设置代理,遵守对应的协议,来完成进一步需求。
[NSURLConnection connectionWithRequest:request delegate:self];
- NSURLConnectionDelegate协议的代理方法,主要是用来判断连接状态,处理各类连接情况,常用的就是连接失败。
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
// 获取到对应错误信息。
if(error) {
NSLog(@"%@", [error localizedDescription]);
}
}
- NSURLConnectionDataDelegate协议的代理方法则主要是获取服务器响应,接收数据。
//收到服务器响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"收到服务器响应");
}
//可以多次拼接获取的数据 (self.myData是NSMutableData类型属性,是保存多次接收的数据的一个容器)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.myData appendData:data];
NSLog(@"收到数据");
}
//完成数据接收
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSError *error = nil;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.myData options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error];
if(error) {
NSLog(@"%@", [error localizedDescription]);
}
NSLog(@"%@", dic);
}