网络开发方案
在iOS中,常见的发送HTTP请求的方案包括:
- 苹果官方
- 第三方框架
NSURLConnection 在IOS9之后,已经被苹果废弃,取而代之的是iOS7之后出现的NSURLSession
1.NSURLConnection发送网络请求
1.设置URL NSURL:确定要访问的资源
2.创建请求 NSURLRequest:根据 URL 建立请求,向服务器索要数据
3.发送请求 NSURLConnection:建立网络连接,将请求发送给服务器
4.数据处理 response,data,error处理
- (void)viewDidLoad {
[super viewDidLoad];
// 1.URL : 注意,在客户端开发中,协议头一定要手写上去
NSURL *URL= [NSURL URLWithString:@"http://www.baidu.com"];
// 2.请求 (request)
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
// 3.发送请求--默认是GET请求
/*
参数1 : request
参数2 : queue : 队列,并发队列,completionHandler所在的队列;如果你想在completionHandler里面刷新UI,队列需要时主队列
参数3 : completionHandler : 请求之后,得到了响应体的回调,这个回调是在子线程执行的(异步回调)
提示 : completionHandler 其实是在耗时操作执行结束之后回调
提示 :sendAsynchronousRequest 是耗时的
*/
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@",[NSThread currentThread]);
/*
response : 响应头
data : 响应体(是程序猿需要的数据,二进制的)
connectionError : 错误信息
*/
//是服务器告诉客户端的额外信息
NSLog(@"响应头 %@",response);
// 响应体
NSLog(@"响应体 %@",data);
//错误信息
NSLog(@"错误信息 %@",connectionError);
// 错误处理
if (connectionError == nil && data != nil && data.length > 0) {
// 获取data
// 4.处理响应 : 响应体就是程序猿需要的数据
NSLog(@"%@",data);
} else {
NSLog(@"%@",connectionError);
}
}];
}
2.NSURLConnection请求缓存策略和超时时长
缓存策略:cachePolicy
/*
cachePolicy : 缓存策略
NSURLRequestUseProtocolCachePolicy = 0, 使用HTTP协议的默认缓存
NSURLRequestReloadIgnoringLocalCacheData = 1, 忽略本地缓存,只加载"最新"网络数据 (股票)
NSURLRequestReturnCacheDataElseLoad = 2, 优先加载缓存数据,如果没有缓存数据就加载最新的数据
NSURLRequestReturnCacheDataDontLoad = 3, 只加载本地缓存数据 (离线APP / 离线地图)
*/
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:0 timeoutInterval:15.0];
超时时长:timeoutInterval
- 默认网络时长是 60 s
- 建议超时时长 15~30 秒之间
- SDWebImage 的默认超时时长是 15 秒
- AFN 的默认超时时长是 60 秒
3.NSURLConnection可变请求NSMutableURLRequest
设置请求超时等待时间(超过这个时间就算超时,请求失败)- (void)setTimeoutInterval:(NSTimeInterval)seconds;
设置请求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;
设置请求体- (void)setHTTPBody:(NSData *)data;
设置请求头- (void)setValue:(NSString )value forHTTPHeaderField:(NSString )field;
- (void)viewDidLoad {
[super viewDidLoad];
// 1.URL : 注意,在客户端开发中,协议头一定要手写上去
NSURL *URL = [NSURL URLWithString:@"http://www.baidu.com"];
// 2.创建可变的请求对象,可以告诉服务器一些你想告诉的额外信息
NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL cachePolicy:0 timeoutInterval:15.0];
// 可以设置请求方法 :
// 提示 : 苹果的网络框架默认是GET请求
requestM.HTTPMethod = @"GET";
// requestM.HTTPMethod = @"POST";
// requestM.HTTPMethod = @"HEAD";
// 发送请求时,告诉服务器我的客户端是苹果设备 (User-Agent: iPhone AppleWebKit)
[requestM setValue:@"iPhone AppleWebKit" forHTTPHeaderField:@"User-Agent"];
// 3.发送请求
// NSURLConnection : 默认是GET请求
[NSURLConnection sendAsynchronousRequest:requestM queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 4.处理响应 : 响应体就是程序猿需要的数据 (错误处理)
if (connectionError == nil && data != nil && data.length > 0) {
} else {
NSLog(@"%@",connectionError);
}
}];
}
4.NSURLConnection响应
此处不谈论状态行,只讨论响应头和响应体
- 响应头 response
- 响应体 data
- data 服务器返回的二进制数据,程序员最关心的内容
- 拿到响应体之后,无法直接使用,需要进行反序列化,转换成OC对象.
// 4.处理响应 : 响应体就是程序猿需要的数据 (错误处理)
if (connectionError == nil && data != nil && data.length > 0) {
// data二进制数据不能直接展示在界面上,客户端无法直接展示/使用二进制数据,我们就需要进行数据解析,把二进制数据转换成客户端可以直接展示/使用的数据
// 1. data是HTML5字符串类型的数据处理
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// baseURL : 相对URL / 相对路径
[weakSelf.myWebView loadHTMLString:html baseURL:URL];
// 2. data是json类型的数据处理
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
} else {
NSLog(@"%@",connectionError);
}
5.NSURLConnectionDataDelegate代理方法
//当接收到服务器的响应(连通了服务器)时会调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
//当服务器的数据加载完毕时就会调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
//请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
-(void)connection: