ASIHTTPRequestクラスライブラリの使用


以前、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では、Webページ、スタイルシート、スクリプトなどのリソースファイルを含む完全なWebページをダウンロードし、UIWebView/WebViewに表示できます.任意のサイズのページを無期限にキャッシュできるため、ネットワークがなくてもオフラインで閲覧できます.
クライアント証明書のサポート
エージェントによるHttpリクエストの開始をサポート
帯域幅制限をサポートします.iOSプラットフォームでは、現在のネットワーク状況に応じて帯域幅を制限するかどうかを自動的に決定できます.例えば、WWAN(GPRS/Edge/3 G)ネットワークを使用する場合、WIFIを使用する場合、制限はありません.
ブレークポイントの継続をサポート
同期および非同期リクエストのサポート
 
公式サイトアドレス:IOSにおける要求サーバ側メソッド
 
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/libxml 2に設定
 
ASIHTTPRequestには多くの機能があり、すべての機能説明は公式サイトの関連ドキュメントで調べることができます.本稿では、ASIHTTPRequestを使用してHttpリクエストと非同期Httpリクエストを同期する方法について簡単に説明します.
 
ASIHTTPRequestを使用する必要があるヘッダファイルに、次のコードを追加します.
 
#import "ASIHTTPRequest.h"

 
これにより、ASIHTTPRequest関連クラスをコードに使用できます.
 
同期要求の作成
 
これはASIHTTPRequestの最も簡単な使用モードで、startSynchronousメッセージを送信すると、同じスレッドでHTTPリクエストが実行され始め、リクエストが終了するまでスレッドが待機します(リクエストが成功または失敗します).errorプロパティをチェックすることで、リクエストが成功したか、エラーが発生したかを判断できます.
返されるテキスト情報を取得するには、responseStringメソッドを呼び出します.画像、MP 3などのバイナリファイルがダウンロードされている場合、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];
    } 
}