ASIHTTPRequest类库的使用

以前,写了一篇关于服务端请求的文章: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];
    } 
}
 

猜你喜欢

转载自eric-gao.iteye.com/blog/1610355