基于ASIHTTPRequest封装的HttpClient
ASIHTTPRequest作为一个比较知名的http访问库本身功能比较强大,在项目开发过程中,如果每个请求,都要使用ASIHTTPRequest来写,有以下几个弊端:
(1)繁琐,无封装性。
(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
基于ASIHTTPRequest封装的HttpClient的更多相关文章
- ASIHttpRequest封装
ASIHttpRequest是一个非常好的库,只是直接使用稍嫌麻烦,以下就尝试来封装一下吧. 思路:每次请求时,须要创建一个ASIHttpRequest对象,设置它的属性(url,delegate.p ...
- 基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架
接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...
- 基于highcharts封装的组件-demo&源码
前段时间做的项目中需要用到highcharts绘制各种图表,其实绘制图表本身代码很简单,但是由于需求很多,有大量的图形需要绘制,所以就不得不复制粘贴大量重复(默认配置等等)的代码,所以,后来抽空自己基 ...
- 基于jQuery封装的分页组件
前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...
- 基于AFN封装的带缓存的网络请求
给大家分享一个基于AFN封装的网络请求 git: https://github.com/zhouxihi/NVNetworking #带缓存机制的网络请求 各类请求有分带缓存 , 不带缓存, 可自定义 ...
- 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件
目录 1. 前言 2. 关于vue-simple-uploader 3. 基于vue-simple-uploader封装全局上传组件 4. 文件上传流程概览 5. 文件分片 6. MD5的计算过程 7 ...
- 基于dispatch_after封装YXTimer
基于dispatch_after封装YXTimer 本人根据dispatch_after封装了一个定时器,支持block以及代理的方式来激活定时器,适用于对精度要求低,耗时短的地方,高端大气上档次,低 ...
- 基于epoll封装的事件回调miniserver
epoll技术前两节已经阐述过了,目前主要做一下封装,很多epoll的服务器都是采用事件回调方式处理, 其实并没有什么复杂的,我慢慢给大家阐述下原理. 在networking.h和networking ...
- vue可视化图表 基于Echarts封装好的v-charts简介
**vue可视化图表 基于Echarts封装好的v-charts** 近期公司又一个新的需求,要做一个订单和销售额统计的项目,需要用到可视化图表来更直观的展示数据.首先我想到的是Echarts,众所周 ...
随机推荐
- Codeforces Round #447 (Div. 2) C 构造
现在有一个长度为n的数列 n不超过4000 求出它的gcd生成set 生成方式是对<i,j> insert进去(a[i] ^ a[i+1] ... ^a[j]) i<=j 然而现在给 ...
- Android中Fragment的Hide和Show
我们都知道,Fragment动态添加的时候我们可以使用FragmentTransaction的add和replace方法,replace方法就等效于对这个Fragment先执行remove(),再执行 ...
- C++ 进阶学习 ——模板
模板和重载类似,比重载更省事 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 类模板针对仅数据成员和成员函数类型不同的类. 一个简单的函数模板 template <cla ...
- java中的char类型所占空间
java中统一使用unicode编码,所以每个字符都是2个字节16位.unicode包括中文,所以对String类计算长度的时候,一个中文和一个英文都是一个长度.String voice = &quo ...
- spring3: 对JDBC的支持 之 关系数据库操作对象化
7.3.1 概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...
- day26 CRM search && 增删改查
代码:https://github.com/liyongsan/git_class/tree/master/day26/LuffyCRM ORM查询之Q学习 http://www.cnblogs.co ...
- New Concept English three (44)
25w/m 32errors People travelling long distances frequently have to decide whether they would prefer ...
- AndroidManifest.xml activity属性设置大全
1.android:allowTaskReparenting=["true"|"false"] 是否允许activity更换从属的任务,比如从短信息任务切换到浏 ...
- php项目,cpu暴增问题查找
背景: 前几天通过WordPress上线一个应用(前后台部署分离,后台走内网内部使用,前台做了全站缓存对外使用). 今天访问后台应用发现开始报504,一段时间后全部504. 解决方案: 登录容器发现容 ...
- Fast Arrangement (线段树,延迟标志)
个人心得:线段树的延迟标志确实是减少了很多时间,思想比较简单,但是实现得时候和建立延迟的时候比较麻烦. 按照我的一些理解,就是更新时找到完全覆盖的区间时,更新延迟标志,不再往下更新,但此时父节点啥的都 ...