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. python测试函数的使用时间

    1. 使用装饰器来衡量函数执行时间 有一个简单方法,那就是定义一个装饰器来测量函数的执行时间,并输出结果:(代码通用3.x) import time from functools import wra ...

  2. koa2使用&&中间件&&angular2的koa托管

    文章导航 1,koa2使用: 2,写中间件: 3,koa2路由配置angular2; 一.先上代码,一篇,看完koa2中大多基础方法: const Koa=require('koa'); const ...

  3. 离线安装Chrome扩展和App

    ------------------离线安装扩展------------------下载1. 用Get CRX扩展到Web Store页,点开一个扩展,右键 Get CRX 可将扩展下载到本机.2. ...

  4. Windows Server 2016 桌面环境的自动配置脚本(2017-10-24更新)

    github:https://github.com/m2nlight/WindowsServerToWindowsDesktop 下载:https://github.com/m2nlight/Wind ...

  5. iOS唯一标示符引导

         在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标 ...

  6. CSS3的transition和transform

    CSS3中的transition和transform是制作HTML5动画一定要使用到的两个属性. 注:这篇文章不考虑兼容性,只讨论webkit核心的浏览器.所以本文的所有例子请用chrome,safa ...

  7. laravel支持的日志写入模式和日志严重程度级别:

    四种日志写入模式: single:单一的 daily:日常的 syslog:系统记录 errorlog:错误日志 Monolog 识别以下严重程度的级别, 从低到高为: debug. info.not ...

  8. MySQL 实践

    一.下载MySQL 1.mysql-noinstall-5.1.73-win32.zip 2.mysql-connector-net-6.8.3.msi 二.安装MySQL 三.连接MySQL 1.A ...

  9. 模拟form提交数据

    最近在做一个项目,发现ajax不能enctype=”multipart/form-data” 属性的表单,没办法,只能使用form表单直接提交的方法了,但是form表单直接提交会跳转页面,这样很不友好 ...

  10. UI-自定义TabBar

    MyCustomTabBar.h文件 #import <UIKit/UIKit.h> @interface MyCustomTabBar : UITabBarController @end ...