以前,写了一篇关于服务端请求的文章:IOS中请求服务器端方法,使用的是iOS SDK中的API,调用起来比较繁琐,这篇文章主要是关于通过ASIHTTPRequest类库请求服务端的方法。
ASIHTTPRequest是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。
ASIHTTPRequest的功能很强大,主要特色如下:
通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作
下载的数据,可存储到内存中或直接存储到磁盘中
能上传本地文件到服务端
可以方便的访问和操作请求和返回的Http头信息
可以获取到上传或下载的进度信息,为应用程序提供更好的体验
支持上传或下载队列,并且可获取队列的进度信息
支持基本、摘要和NTLM身份认证,在同一会话中授权凭证会自动维持,并且可以存储在Keychain中
支持Cookie
当应用在后台运行时,请求可以继续运行
支持GZIP压缩数据
内置的ASIDownloadCache类,可以缓存请求返回的数据,这样即使没有网络也可以返回已经缓存的数据结果
ASIWebPageRequest可以下载完整的网页,包括包含的网页、样式表、脚本等资源文件,并显示在UIWebView/WebView中。任意大小的页面都可以无限期缓存,这样即使没有网络也可以离线浏览
支持客户端证书
支持通过代理发起Http请求
支持带宽限制。在iOS平台,可以根据当前网络情况来自动决定是否限制带宽,例如当使用WWAN(GPRS/Edge/3G)网络时限制,而当使用WIFI时不做任何限制
支持断点续传
支持同步和异步请求
官网地址:http://allseeing-i.com/ASIHTTPRequest/
如果想在iOS项目中使用ASIHTTPRequest,需要在项目中进行简单的配置。
1、将ASIHTTPRequest的相关文件加入项目中,所需文件列表如下:
ASIHTTPRequestConfig.h
ASIHTTPRequestDelegate.h
ASIProgressDelegate.h
ASICacheDelegate.h
ASIHTTPRequest.h
ASIHTTPRequest.m
ASIDataCompressor.h
ASIDataCompressor.m
ASIDataDecompressor.h
ASIDataDecompressor.m
ASIFormDataRequest.h
ASIInputStream.h
ASIInputStream.m
ASIFormDataRequest.m
ASINetworkQueue.h
ASINetworkQueue.m
ASIDownloadCache.h
ASIDownloadCache.m
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
Reachability.h
Reachability.m
2、将相关的类库加入项目中,列表如下:
SystemConfiguration.framework
MobileCoreServices.framework
CoreGraphics.framework
CFNetwork.framework
libxml2.dylib
libz.dylib
3、Search Paths中的Header Search Paths设置为:${SDK_DIR}/usr/include/libxml2
ASIHTTPRequest有很多功能,所有功能说明都可以在其官方网站的相关文档中查到,本文仅简单介绍一下如何使用ASIHTTPRequest来进行同步Http请求和异步Http请求。
在需要使用ASIHTTPRequest的头文件中加入以下代码:
#import "ASIHTTPRequest.h"
这样就可以在代码中使用ASIHTTPRequest相关的类了。
创建一个同步请求
这是ASIHTTPRequest最简单的一种使用模式,发送startSynchronous消息后即开始在同一线程中执行HTTP请求,线程将一直等待直到请求结束(请求成功或者失败)。通过检查error属性可以判断请求是否成功或者有错误发生。
要获取返回的文本信息,调用responseString方法。如果下载的是二进制文件,例如图片、MP3,则调用responseData方法,可以得到一个NSData对象。
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request startSynchronous]; NSError *error = [request error]; if (!error) { NSString *response = [request responseString]; }
创建一个异步请求
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self]; [request startAsynchronous]; - (void)requestFinished:(ASIHTTPRequest *)request { // 当以文本形式读取返回内容时 NSString *responseString = [request responseString]; // 当以二进制形式读取返回内容时 NSData *responseData = [request responseData]; } - (void)requestFailed:(ASIHTTPRequest *)request { NSString *message = NULL; NSError *error = [request error]; switch ([error code]) { case ASIRequestTimedOutErrorType: message = kAlertMsgTimeoutError; break; case ASIConnectionFailureErrorType: message = kAlertMsgConnectionFailError; break; case ASIAuthenticationErrorType: message = kAlertMsgAuthFailError; break; case ASITooMuchRedirectionErrorType: message = kAlertMsgTooManyRedirect; break; case ASIRequestCancelledErrorType: message = kAlertMsgReqCancelledError; break; case ASIUnableToCreateRequestErrorType: message = kAlertMsgUnableCreateReqError; break; case ASIInternalErrorWhileBuildingRequestType: message = kAlertMsgUnableBuildReqError; break; case ASIInternalErrorWhileApplyingCredentialsType: message = kAlertMsgUnableApplyCredError; break; case ASIFileManagementError: message = kAlertMsgFileManageError; break; case ASIUnhandledExceptionError: message = kAlertMsgUnhandledExcepError; break; case ASICompressionError: message = kAlertMsgCompressionError; break; default: message = kAlertMsgGenericError; break; } if (NULL != message) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:kApplicationTitle message:message delegate:self cancelButtonTitle:kAlertDefaultCancel otherButtonTitles:nil]; [alert show]; } }