使用ASIHTTPRequest从框架实现网络编程
ASIHTTPRequest支持如下功能
(1) 开发者只要面向简单的编程接口,即可向服务器端提交数据和从服务器端获取数据。
(2) 支持同步和异步请求。
(3) 从服务器下载的数据,既可存储到内存中,也可直接存储到磁盘中。
(4) 支持文件上传。
(5) 支持断点续传。
(6) 可以直接访问、修改HTTP请求与响应的头信息。
(7) 支持实时获取上传文件、下载文件的进度,从而向用户提供给更好的体验。
(8) 使用队列来管理上传、下载任务,并且可获取队列的进度信息。
(9) 支持Cookie。
(10) 支持请求与响应Gzip压缩数据。
(11) 内置的ASIDownloadCache类,可以缓存请求返回的数据,这样即使没有网络也可以返回已经缓存的数据结果。
(12) 使用ASIWwbPageRequest可以直接下载完整的网页,包括该网页包含的内嵌网页、样式单、JS脚本等资源,并可将下载的网页直接显示在UIWwbView/WebView中。任意大小的页面都可以无限期缓存,这样即使没有网络也可以离线浏览。
(13) 支持认证与授权。
(14) 支持通过代理发起HTTP请求。
(15) 支持带宽限制,可以根据当前网络情况来自动决定是否限制带宽。
发送同步或异步的GET请求
使用ASIHTTPRequest发送请求、接收响应只需如下几步:
(1) 根据请求URL创建ASIHTTPRequest对象。如果需要发送带请求参数的POST请求或上传文件,则需要根据请求URL创建ASIFormDataRequest对象。
(2) 如果要添加请求头,则调用ASIHTTPRequest对象的addRequestHeader:value:方法发送请求;如果要发送带请求参数的POST请求,则调用ASIFormDataRequest的setPostValue:forKey:方法添加请求参数;如果要上传文件,则调用ASIFormDataRequest的setFile:withFileName:andContentType:forKey:或setData:withFileName:andContentType:forKey:方法来设置要上传的文件路径或文件数据。
(3) 如果要发送同步请求,则调用ASIHTTPRequest对象的startSynchronous方法发送请求;如果要发送异步请求,则可通过如下两种方式来设置回调处理代码:
1) 为ASIHTTPRequest设置delegate对象,该delegate对象实现ASIHTTPRequestDelegate协议,当程序通过ASIHTTPRequest发送请求完成时、请求失败时都会激发delegate对象的特定方法。
2) 为ASIHTTPRequest设置请求完成、请求失败的代码块,当程序通过ASIHTTPRequest发送请求完成时、请求失败时都会激发相应的代码块。
(4) 当发送请求、获取响应成功后,可通过ASIHTTPRequest对象的responseString或responseData来获取服务器响应,其前者用于获取服务器形影的字符串,后者用于获取服务器响应的二进制数据;如果需要通过服务器响应的其他信息,则可通过如下方法来实现:
1) responseStatusCode:获取服务器响应的状态码。
2) responseStatusMessage:获取服务器响应的状态字符串。
3) responseHeaders:获取服务器响应的全部响应头,该方法返回一个NSDictionary对象。
使用代码块
当程序使用ASIHTTPRequest发送异步请求时,即可用delegate为ASIHTTPRequest设置回调处理代码,也可使用代码块设置回调处理代码。代码块设置回调处理,则通过如下两个方法:
(1) setCompletionBlock:设置发送请求、获取服务器响应完成时激发的代码块。
(2) setFailedBlock:获取发送请求失败时激发的代码块。
使用NSOperationQueue管理请求
当使用NSOperationQueue来管理ASIHTTPRequest请求时,无须调用ASIHTTPRequest的startAsynchronous方法发送请求,只要将ASIHTTPRequest对象添加到NSOperationQueue的队列中即可。
为不同的ASIHTTPRequest设置不同的回调处理,有如下三种方式:
(1) 如果程序只是要简单地区分请求本身,则可通过为ASIHTTPRequest设置userInfo或tag属性,回调方法或回调代码块通过判断ASIHTTPRequest的userInfo、tag即可区分不同的请求,从而针对不同请求作出相应的处理。
(2) 如果需要对不同请求设置完全不同的回调处理,则可通过ASIHTTPRequest的setDidFinishSelector:或setDidFailSelector:方法为不同的请求分别设置不同的回调处理方法。
(3) 如果需要处理更复杂的情况,甚至需要在后台解析服务器响应,那么可以考虑为每个请求派生ASIHTTPRequest的子类,在子类中仅仅重写requestFinished:和failWitError:来提供自定义的回调处理即可
如果程序需要取消某个异步请求,则可调用如下两个方法之一:
(1) cancel:取消调用该方法的ASIHTTPRequest对象所代表的异步请求,该请求将会当做发生错误处理。
(2) clearDelegatesAndCancel:取消调用该方法的ASIHTTPRequest对象所代表的异步请求,该请求将会被当成错误处理。而且清除为该ASIHTTPRequest对象设置的delegate或所有回调处理代码块。
发送请求参数和文件上传
如果需要发送带参数的POST请求,或处理文件上传,则需要使用ADIFormDataRequest,它是ASIHTTPRequest的子类,专门用于发送带请求参数的POST请求,包括上传文件。
ASIFormDataRequest提供的方法即可添加请求头,也可添加参数,还可添加上传的文件。
使用ASIFormDataRequest与使用ASIHTTPRequest的方法大致相同,只是ADIFormDataRequest允许设置额外的请求参数。