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

昵    称:
验证码:

相关文档: