ASIHTTPRequest 封裝

jopen 11年前發布 | 24K 次閱讀 iOS開發 移動開發 ASIHTTPRequest

iOS 網絡請求常用第三方庫ASI,使用方便。

調用方法:  一個請求和實現三個協議。

主要步驟:

1. 新建一個.h文件,用于新建枚舉型和聲明協議

標記post請求狀態

////////////////////////////////////////////////////////////////////////////////////////

//TypeDefine.h

////////////////////////////////////////////////////////////////////////////////////////

enum kPostStatus{

kPostStatusNone=0,

kPostStatusBeging=1,

kPostStatusEnded=2,

kPostStatusError=3,

kPostStatusReceiving=4

};

typedef enum kPostStatus kPostStatus;

頁面請求ASI接口的標記

enum kBusinessTag

{

kBusinessTagDirectory= 0,   //獲取通訊錄

kBusinessTagRootLogin=1,      //首頁登錄

kBusinessTagGetUnits=2,       //獲取單位部門

kBusinessTagGetUnitPersons=3,  //獲取部門人員

kBusinessTagBinding=4,        //進行設備綁定

kBusinessTagBindInfo=5,       //獲取綁定信息

kBusinessTagDynaPass=6,       //獲取動態密碼

kBusinessTagSPLogin=7,        //短信平臺登錄

kBusinessTagSPSendSMS=8,       //群發短信

kBusinessTagQXTLogin=9,        //企信通登錄

kBusinessTagQXTMailList=10,    //企信通收件箱

kBusinessTagQXTAttach=11,      //企信通附件獲取

kBusinessTagQXTMarkRead=12,    //企信通標志已讀

kBusinessTagQXTAddresses=13,     //企信通獲取收件人

kBusinessTagSPSmsRecords=14,     //短信平臺發送記錄查詢

kBusinessTagQXTSendMail=15,      //企信通發送郵件

kBusinessTagVersion=16,          //獲取系統版本

kBusinessTagHelpInfo=17,         //獲取幫助文檔

kBusinessTagModifySettings=18,   //修改設置

kBusinessTagFeedback=19,         //意見反饋

kBusinessTagUnlock=20,           //解鎖

kBusinessTagLog=21 ,             //記錄日志

kBusinessUserIdential=22,        //身份驗證

kBusinessTagVersion_net=23,       //外網獲取系統版本

kAttenPubicMessage=24 ,       //獲取發布信息

KsetInfoReadMessage=25,   //已讀信息回執設置

KFeedBackQuery  = 26     //意見反饋查詢

};

typedef enum kBusinessTag kBusinessTag;

聲明一個協議,這個協議的三個方法在調用的頁面實現

@protocol NetworkModuleDelegate<NSObject>

@optional

-(void)beginPost:(kBusinessTag)tag;

-(void)endPost:(GDataXMLDocument)result business:(NSNumber)tag;

-(void)errorPost:(NSError)err business:(NSNumber)tag;

@end

////////////////////////////////////////////////////////////////////////////////////////

//NetworkModule 類

////////////////////////////////////////////////////////////////////////////////////////

2.新建一個網絡模塊 :NetworkModule 和 PostRequest

//NetworkModule.h

<ASIHTTPRequestDelegate>{

NSMutableDictionary* queue;

}

+(NetworkModule*)sharedNetworkModule; //單例

-(void)postBusinessReq:(NSString*)xml //UI調用接口

tag:(kBusinessTag)tag

owner:(id<NetworkModuleDelegate>)owner;

-(void)postXML:(NSString*)xml

tag:(kBusinessTag)tag

owner:(id<NetworkModuleDelegate>)owner

url:(NSString*)url;

-(void)cancel:(kBusinessTag)tag;

//NetworkModule.m

  • (id)init

{

self = [super init];

if (self) {

    queue=[[NSMutableDictionary alloc]init];

}

return self;

}

  • (NetworkModule *)sharedNetworkModule

{

static NetworkModule *gInstance = NULL;



@synchronized(self)

{

    if (!gInstance)

        gInstance = [self new];

}



return(gInstance);

}

-(void)postBusinessReq:(NSString*)xml //根據網絡配置IP

tag:(kBusinessTag)tag

owner:(id<NetworkModuleDelegate>)owner{

NSMutableArray* arr=[[NSMutableArray alloc]init];

if ([[PingResult sharedPingResult]apnSuccess]) {

    [arr addObject:APN_IP];

}else if([[PingResult sharedPingResult]intraSuccess]){

    [arr addObject:INTRA_IP];

}else{

    [arr addObject: INTER_IP];

}

NSString* s=[NSString stringWithFormat:@"SELF LIKE '%@'",server_ip];

NSPredicate* pre=[NSPredicate predicateWithFormat:s];

[arr filterUsingPredicate:pre];

if (arr.count>0){

    [self postXML:xml tag:tag owner:owner

              url:[NSString stringWithFormat:interface_url,server_ip]];

}else{

    if (owner) {

        NSError* err=[[NSError alloc]initWithDomain:ErrorDomain

                                               code:7001

                                           userInfo:nil];

        [owner errorPost:err business:[NSNumber numberWithInt:tag]];

    }

}

[arr release];

}

-(void)postXML:(NSString*)xml //外網地址

tag:(kBusinessTag)tag

owner:(id<NetworkModuleDelegate>)owner

url:(NSString*)url{

PostRequest* req=(PostRequest*)[queue objectForKey:[NSNumber numberWithInt:tag]];

if (req==nil) {

    req=[[PostRequest alloc]init];

}

req.businessTag=tag;

req.postStatus=kPostStatusNone;



[queue setObject:req forKey:[NSNumber numberWithInt:tag]];

req.enc=NSUTF8StringEncoding;

req.owner=owner;



req.url=url;

NSLog(@"%s:%@",__FUNCTION__,req.url);

[req postXML:xml delegate:self];

}

-(void)cancel:(kBusinessTag)tag{

PostRequest* req=(PostRequest*)[queue objectForKey:[NSNumber numberWithInt:tag]];

if (req && [req isKindOfClass:[PostRequest class]]) {

    [req cancel];

}

}

// 請求結束,獲取 Response 數據

  • (void)requestFinished:(ASIHTTPRequest *)request

{

PostRequest* req=(PostRequest*)[queue objectForKey:

                                [NSNumber numberWithInt:request.tag]];

req.postStatus=kPostStatusEnded;

if (req.owner!=nil) {

    SEL sel=@selector(endPost:business:);

    if ([req.owner respondsToSelector:sel]) {

        NSLog(@"result:==%@",req.result);

        [req.owner performSelector:sel withObject:req.result

                        withObject:[NSNumber numberWithInt: req.businessTag]];

    }

}



}

// 請求失敗,獲取 error

  • (void)requestFailed:(ASIHTTPRequest *)request

{

PostRequest* req=(PostRequest*)[queue objectForKey:

                                [NSNumber numberWithInt:request.tag]];

NSError *error = [request error];

NSLog(@"%s,%@",FUNCTION,error.userInfo);

if (req.owner!=nil) {

    SEL sel=@selector(errorPost:business:);

    if ([req.owner respondsToSelector:sel]) {

        [req.owner performSelector:sel withObject:error

                        withObject:[NSNumber numberWithInt: req.businessTag]];

    }

}

}

-(void)dealloc{

[queue release];

[super dealloc];

}

////////////////////////////////////////////////////////////////////////////////////////

//PostRequest類

////////////////////////////////////////////////////////////////////////////////////////

//PostRequest.h

@interface PostRequest : NSObject{

ASIHTTPRequest* _request;

id<NetworkModuleDelegate> owner;

}

@property (nonatomic,retain)id<NetworkModuleDelegate> owner;

@property (nonatomic,retain)NSString* url;

@property (assign)kPostStatus postStatus;

@property (assign)kBusinessTag businessTag;

@property (assign)NSStringEncoding enc;

@property (nonatomic,readonly,getter = result)GDataXMLDocument* result;//用于請求后GData解析XML數據

-(void)cancel;

-(void)postXML:(NSString*)xml delegate:(id)delegate;

//PostRequest.m

@implementation PostRequest

@synthesize postStatus;

@synthesize enc=_enc;

@synthesize url;

@synthesize businessTag=_tag;

@synthesize owner;

-(void)cancel{

if (_request!=nil) {

    [_request release],_request=nil;

}

}

-(void)setOwner:(id<NetworkModuleDelegate>)_owner{

owner=[_owner retain];

}

-(id<NetworkModuleDelegate>)owner{

return owner;

}

-(void)setEnc:(NSStringEncoding)enc{

_enc=enc;

}

-(NSStringEncoding)enc{

return _enc;

}

-(void)setBusinessTag:(kBusinessTag)businessTag{

_tag=businessTag;

}

-(kBusinessTag)businessTag{

return _tag;

}

-(GDataXMLDocument*)result{

if(postStatus==kPostStatusEnded){

    NSData *data = [_request responseData];

    NSString* string=[[NSString alloc] initWithData:data encoding:_enc];

    NSLog(@"%s\nresponse:%@",__FUNCTION__,string);

    GDataXMLDocument* doc=[[GDataXMLDocument alloc] initWithXMLString:

                           string options:0 error:nil];

    return doc;

}else

    return nil;

}

-(void)postXML:(NSString*)xml delegate:(id)delegate{

[self cancel];

_request=[[ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]retain];

[_request setShouldAttemptPersistentConnection:NO];

[_request setResponseEncoding:_enc];

NSMutableDictionary *reqHeaders = [[NSMutableDictionary alloc] init];

[reqHeaders setValue:@"text/xml; charset=UTF-8" forKey:@"Content-Type"];

_request.requestHeaders = reqHeaders;

[reqHeaders release];

NSLog(@"post xml:%@",xml);

// 重要

_request.tag=_tag;

[_request appendPostData:[xml dataUsingEncoding:_enc]];

[_request setDelegate:delegate];

postStatus=kPostStatusBeging;

if(self.owner) [self.owner beginPost:self.businessTag];

[_request startAsynchronous];

}

-(void)dealloc{

[owner release],owner=nil;

[_request release];

[super dealloc];

}

////////////////////////////////////////////////////////////////////////////////////////

//請求調用

////////////////////////////////////////////////////////////////////////////////////////

調用地方實現 NetworkModuleDelegate協議

NSString* postXML=SPSmsRecordsXml([[SPLoginInfo sharedSPLoginInfo]account],

                              [[SPLoginInfo sharedSPLoginInfo]pass],

                              beginDay,endDay);

[[NetworkModule sharedNetworkModule]postBusinessReq:postXML tag:kBusinessTagSPSmsRecords owner:self];//請求

pragma mark -NetworkModuleDelegate

-(void)beginPost:(kBusinessTag)tag{

[indicator show:YES];

[indicator showMessage:@"正在獲取數據" delay:1];

}

-(void)endPost:(GDataXMLDocument )result business:(NSNumber)tag{

if (tag.intValue==kBusinessTagSPSmsRecords) {



    records=[[SmsRecordInfo alloc]initWithXMLElement:result.rootElement];



}

[indicator showMessage:@"數據獲取成功" delay:1];

}

-(void)errorPost:(NSError )err business:(NSNumber)tag{

[indicator showMessage:@"網絡錯誤" delay:1];

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!