步骤
NSURL:确定要访问的资源
NSURLRequest:根据URL建立请求,向服务器索要数据
NSURLConnection:建立网络连接,将请求发送给服务器
示例代码
// 1. NSURL:确定要访问的资源NSURL*url = [NSURLURLWithString:@"http://www.baidu.com"];// 2. NSURLRequest:根据 URL 建立请求,向服务器索要数据NSURLRequest*request = [NSURLRequestrequestWithURL:url];// 3. NSURLConnection:建立网络连接,将请求异步的发送给服务器[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSData*data,NSError*connectionError) {// 响应头NSLog(@"response %@",response);// 响应体NSLog(@"data %@",data);// 链接是否出错NSLog(@"connectionError %@",connectionError);}];
sendAsynchronousRequest发送异步请求
此方法就是异步执行的,程序员无需考虑开启线程,或者创建队列
会将之前建立好的请求异步发送给服务器
等到接收到服务器响应后,由queue负责调度completionHandler的执行
队列
调度completionHandler执行的队列
[[NSOperationQueue alloc] init],后台线程异步执行
[NSOperationQueue mainQueue],主线程异步执行
队列的选择
如果要对数据进行耗时处理,例如:解压缩等,选择新建队列调度
如果只是做简单处理,立即更新 UI,选择主队列
completionHandler
网络访问已经结束,接收到服务器响应数据后的回调方法
response,服务器的响应头,通常在开发下载功能时才会使用
一般情况下data响应体才是我们发送请求真正需要的数据.
connectionError当链接出错时就会告诉程序猿链接出错的原因,如果链接正常,就返回nil.
completionHandler 里面进行错误处理
判断connectionError是否有值,如果有值说明链接出错,后续代码不需要再执行.此时直接返回.
// 判断链接是否出错if(connectionError !=nil) {NSLog(@"链接出错");return;}
如果链接没错,再从响应里面取出状态码.当状态码是200和304时说明响应没错.就可以操作响应体data了.
NSURLResponse里面没有状态码,在其子类NSHTTPURLResponse里面.
// 判断响应是否正常 : 如果响应正常了,就去操作响应头和响应体NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response;if(HTTPURLResponse.statusCode==200|| HTTPURLResponse.statusCode==304) {// 响应头NSLog(@"response %@",response);// 响应体NSLog(@"data %@",data); }
其他错误处理的方式
if(connectionError !=nil|| data ==nil) {NSLog(@"网络不给力");return;}
缓存策略和超时时长
创建请求对象 (缓存策略和超时时长都是默认的)
NSURLRequest*request = [NSURLRequestrequestWithURL:url];
创建请求对象的同时制定缓存策略和超时时长
// 创建请求对象的NSURLRequest*request = [NSURLRequestrequestWithURL:url cachePolicy:0timeoutInterval:15];
缓存策略
枚举数值说明
NSURLRequestUseProtocolCachePolicy 0 默认的缓存策略
NSURLRequestReloadIgnoringLocalCacheData 1 忽略本地缓存数据,始终加载服务器的数据
对数据的及时性要求高的应用
例如:彩票、股票等
NSURLRequestReturnCacheDataElseLoad 2 如果有缓存,就返回缓存,否则加载数据
NSURLRequestReturnCacheDataDontLoad 3 只加载缓存数据,不去服务器上获取(离线地图)
超时时长
默认网络时长是60 s
建议超时时长15~30秒之间
注意超时时长不能太短
SDWebImage的默认超时时长是15秒
AFN的默认超时时长是60秒
可变请求
基于URL建立可变的请求对象
设置请求属性:缓存策略,网络超时时长
告诉服务器额外信息:客户端类型...
// 可变的请求对象才能设置额外的信息NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url cachePolicy:0timeoutInterval:15];// 设置请求头 : 告诉服务器,我的设备是iphone[requestM setValue:@"iphone AppleWebKit"forHTTPHeaderField:@"User-Agent"];
响应体 data
data服务器返回的二进制数据,程序员最关心的内容
拿到响应体之后,无法直接使用,需要进行反序列化,转换成OC对象.