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的更多相关文章

  1. ASIHttpRequest封装

    ASIHttpRequest是一个非常好的库,只是直接使用稍嫌麻烦,以下就尝试来封装一下吧. 思路:每次请求时,须要创建一个ASIHttpRequest对象,设置它的属性(url,delegate.p ...

  2. 基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架

    接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...

  3. 基于highcharts封装的组件-demo&源码

    前段时间做的项目中需要用到highcharts绘制各种图表,其实绘制图表本身代码很简单,但是由于需求很多,有大量的图形需要绘制,所以就不得不复制粘贴大量重复(默认配置等等)的代码,所以,后来抽空自己基 ...

  4. 基于jQuery封装的分页组件

    前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...

  5. 基于AFN封装的带缓存的网络请求

    给大家分享一个基于AFN封装的网络请求 git: https://github.com/zhouxihi/NVNetworking #带缓存机制的网络请求 各类请求有分带缓存 , 不带缓存, 可自定义 ...

  6. 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件

    目录 1. 前言 2. 关于vue-simple-uploader 3. 基于vue-simple-uploader封装全局上传组件 4. 文件上传流程概览 5. 文件分片 6. MD5的计算过程 7 ...

  7. 基于dispatch_after封装YXTimer

    基于dispatch_after封装YXTimer 本人根据dispatch_after封装了一个定时器,支持block以及代理的方式来激活定时器,适用于对精度要求低,耗时短的地方,高端大气上档次,低 ...

  8. 基于epoll封装的事件回调miniserver

    epoll技术前两节已经阐述过了,目前主要做一下封装,很多epoll的服务器都是采用事件回调方式处理, 其实并没有什么复杂的,我慢慢给大家阐述下原理. 在networking.h和networking ...

  9. vue可视化图表 基于Echarts封装好的v-charts简介

    **vue可视化图表 基于Echarts封装好的v-charts** 近期公司又一个新的需求,要做一个订单和销售额统计的项目,需要用到可视化图表来更直观的展示数据.首先我想到的是Echarts,众所周 ...

随机推荐

  1. Valid Number,判断是否为合法数字

    问题描述: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " ...

  2. Rotate List ,反转链表的右k个元素

    问题描述: Given a list, rotate the list to the right by k places, where k is non-negative. For example:G ...

  3. numpy数组各种乘法

    In [34]: a Out[34]: array([[1, 4], [5, 6]]) In [35]: b Out[35]: array([[4, 1], [2, 2]]) In [36]: np. ...

  4. CNI:容器网络接口

    CNI 简介 不管是 docker 还是 kubernetes,在网络方面目前都没有一个完美的.终极的.普适性的解决方案,不同的用户和企业因为各种原因会使用不同的网络方案.目前存在网络方案 flann ...

  5. Java 基于JavaMail的邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

  6. vue-cli favicon 怎么引入

    把你的 favicon 图标放到 static 目录下,然后修改 link 标签指向 static 目录下的 favicon 图标文件即可

  7. IOS-将任意对象存进数据库

    model // // HMShop.h // 将任意对象存进数据库 // // Created by apple on 14/11/20. // Copyright (c) 2014年 heima. ...

  8. Android快速开发-选项卡

    介绍 几行代码实现Android选项卡界面,支持标准底部Tab自定义视图选项卡,头部文字选项卡. 底部自定义视图选项卡 先来看看实现下图中的效果我们代码应该怎么写? 实现上图效果只需以下代码: pub ...

  9. c++ wchar_t 与char 直接的转换【转】

    http://blog.163.com/tianshi_17th/blog/static/4856418920085209414977/ 实现了一下 #include "stdafx.h&q ...

  10. mac root

    我在mac下,用su登录root用户 但是提醒 su:Sorry   然后按照网上的方法弄了好多次,都没成功,说是要修改/etc/group 文件中,wheel后添加自己的用户名,用逗号分隔多个用户, ...