基于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,众所周 ...
随机推荐
- docker定义数据卷及数据卷的备份恢复
前言:生产环境中使用docker时,往往需要对数据进行持久化(只有把容器导出为镜像,才能够保存写的数据,否则容器删除或者停止,所有数据都会没有),或者需要在多个容器之间进行数据共享,这必然涉及容器的数 ...
- EditText实现输入表情
EditText实现输入表情 一.简介 editText是TextView的子类,TextView能用的工具EditText都能用,这里就是editText利用SpannableString的Imag ...
- python学习笔记(excel+requests)
已经可以对excel简单的操作后 可以开始通过excel写测试用例 读取用例 执行用例 提前写好execl 如图: 下面是代码: #!/usr/bin/env python # -*- coding: ...
- charles抓包工具的使用:手机抓包设置和安装证书
一. 设置手机抓包 第一步:在charles里设置允许手机联网的权限,并设置接入接口 在Charles的菜单栏上选择"Proxy"->"Proxy Settings ...
- appium自动化测试(三)
一. 层级定位和list 先通过find_element_by_XXX找到父级元素webelement,再通过webelement.find_element_by_XXX寻找子元素 二. 滑动屏幕 滑 ...
- 临时开启Chrome 67拖放crx安装扩展方法
打开Chrome的设置: chrome://flags/#extensions-on-chrome-urls 更改为enabled,应用后重起浏览器,就可以往 chrome://extensions ...
- POJ 1062 限制点
http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50 ...
- MySQL备份与恢复实战案例及生产方案
按天备份 按周备份 mysql的mysqldump备份什么时候能派上用场1,迁移或者升级数据库时2,增加从库的时候3,如果因为硬件或特殊情况,主库或者从库宕机,主从可以互相切换,无需备份4,人为的DD ...
- 关于inline函数
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4975474.html 今天我在优化公司项目代码的过程中,借助了Intel的VTune ...
- css: 基础一
1.display有哪些值?说明他们的作用 @1.block:设定元素为块级元素,占据一整行,可设置宽高. @2.inline-block: 设定元素行内块元素,可设置宽高,一行能显示多个. @3.i ...