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>