ASIHTTPRequest作为一个比较知名的http访问库本身功能比较强大,在项目开发过程中,如果每个请求,都要使用ASIHTTPRequest来写,有以下几个弊端:
(1)繁琐,无封装性。
class="p1">(2)如果直接Synchronous方法,阻塞UI,而使用异步的Asynchronous,则要写很多委托,也是非常的麻烦.
(3)http请求基本上是给一个请求,返回一个请求结果,直接使用ASIHTTPRequest还无法做到,所以需要有一个比较好的封装。
基于以上的三个原因,做了一个封装
(1)头文件
// // HttpClient.h // // Created by likwo on 11-9-7. // blog http://www.cnblogs.com/likwo // Copyright 2013年 . All rights reserved. // #import <Foundation/Foundation.h> #import "ASIHTTPRequestDelegate.h" #import "ASIHTTPRequest.h" @interface HttpClient : NSObject <ASIHTTPRequestDelegate> { BOOL isRequestFinish; NSMutableDictionary *postData; } @property (nonatomic, retain) NSMutableDictionary *postData; @property (nonatomic, assign) BOOL isRequestFinish; @property (nonatomic, assign) NSInteger timeOutSecond; @property (nonatomic, retain)ASIHTTPRequest *request; -(NSString *)get:(NSString *)url error:(NSError **)error; -(NSString *)post:(NSString *)url postData:(NSDictionary *)data error:(NSError **)error; - (void)cancel; @end
(2)实现文件
//
// HttpClient.m
// blog http://www.cnblogs.com/likwo
// Copyright 2013年 . All rights reserved.
//
#import "HttpClient.h"
#import "ASIHTTPRequest.h"
#import "ASIFormDataRequest.h"
@interface HttpClient()
@end
@implementation HttpClient
@synthesize isRequestFinish;
@synthesize postData;
-(void)dealloc
{
self.postData = nil;
[self.request release];
[super dealloc];
}
- (id)init
{
self = [super init];
if (self) {
self.timeOutSecond = 10;
}
return self;
}
-(NSData *)get:(NSString *)url method:(NSString *)method body:(NSString *)body error:(NSError **)error
{
return [self.request responseData];
}
-(NSString *)get:(NSString *)url error:(NSError **)error;
{
#ifdef DEBUG
NSLog(@"request get url %@",url);
#endif
NSURL *nsUrl = [NSURL URLWithString:url];
self.request = nil;
self.request = [ASIHTTPRequest requestWithURL:nsUrl];
[self.request setTimeOutSeconds:self.timeOutSecond];
self.request.delegate = self;
self.isRequestFinish = NO;
[self.request startAsynchronous];
while( !self.isRequestFinish)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
if ([self.request error])
{
*error = [self.request error];
return nil;
}
NSData *responseData = [self.request responseData];
NSString *retStr = [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease];
if (retStr == nil)
{
retStr = [[NSString alloc] initWithData:responseData encoding:NSUnicodeStringEncoding];
}
#ifdef DEBUG
NSLog(@"str %@",retStr);
#endif
return retStr;
}
-(NSString *)post:(NSString *)url postData:(NSDictionary *)data error:(NSError **)error;
{
#ifdef DEBUG
NSLog(@"request post url %@",url);
#endif
NSURL *nsUrl = [NSURL URLWithString:url];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:nsUrl];
[request setDelegate:self];
for(id key in [data allKeys])
{
[request setPostValue:[self.postData objectForKey:key] forKey:(NSString *)key];
}
[request buildPostBody];
#ifdef DEBUG
NSString * str = [[[NSString alloc] initWithData:[request postBody] encoding:NSUTF8StringEncoding] autorelease];
NSLog(@"str %@",str);
#endif
[request startAsynchronous];
self.isRequestFinish = NO;
while( !self.isRequestFinish )
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
if ([request error])
{
*error = [request error];
return nil;
}
return [[[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding] autorelease];
return nil;
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
self.isRequestFinish = YES;
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
self.isRequestFinish = YES;
}
- (void)cancel
{
[self.request cancel];
}
@end
(3)测试项目
测试项目,以获取网站的html的源码来测试的(get方法),post方法还没有测试(如果项目中需要用到,最好测试下,应该不难)。

项目源码下载:http://files.cnblogs.com/likwo/Http-ClientDemo.zip