ASIHTTPRequest 封装

来源:互联网 发布:金蝶数据引出错误3275 编辑:程序博客网 时间:2024/05/19 13:06

心乎爱矣,遐不谓矣,中心藏之,何日忘之

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];

}



原创粉丝点击