ASIHTTPRequest系列(一):同步和异步请求
ASIHTTPRequest提供如下功能:
1、提交数据到web服务器或者从web服务器获得数据;
2、下载数据到内存或磁盘;
3、采用html input相同的机制上传文件;
4、断点续传;
5、简单存取HTTP头;
6、上传/下载进度显示;
7、支持Cookie;
8、后台运行(iOS4.0以上支持);
9、对于请求和响应的GZIP支持;
10、支持客户端证书;
11、支持同步/异步请求;
......
关于它的介绍网上已经有很多了,该项目有很详细的指南文档:How to use ASIHTTPRequest,也有网友翻译成中文了。本文没有完全照搬官方文档的内容,而是着重介绍了几个常见的应用,并涵盖了一些自己的理解和实际应用经验,包括:
安装、简单异步/同步请求、队列请求、上传、下载及 Cookies
注意,虽然这些技术在本文中是分开讲述的,但在实际工作中,往往是多种技术结合应用的。
此外,Http请求往往伴随着XML技术的应用,实际上ASIHTTPRequest是可以和SAX异步解析结合应用的,这部分内容请参考《ASIHTTPRequest和libxml结合,实现边请求边解析》。
项目下载地址: http://github.com/pokeb/asi-http-request/tarball/master
解压缩并打开文件夹,其中包括:
1、一个iPhone Xcode项目(源文件)
2、一个Mac Xcode项目(源文件)
3、一个iPhone下使用的Sample Code(源文件)
4、一个Mac下使用的Sample Code(源文件)
5、一个Readme.texttile,关于该项目的介绍
其实所有的内容都在其中了,如果你是初学者,不知到怎么下手,可以看 http://allseeing-i.com/ASIHTTPRequest/How-to-use这里有一份详细的入门指南。
现在,我们要做的就是,在自己的项目中使用它。
一、在项目中使用ASIHTTPRequest
1、拷贝源文件到项目中
ASIHTTPRequest是一个开源项目,要使用它,直接拷贝项目源文件到你的项目中,包括下列文件(即Classes下所有文件和External/Reachability下所有文件):
ASIHTTPRequestConfig.h
ASIHTTPRequestDelegate.h
ASIProgressDelegate.h
ASICacheDelegate.h
ASIHTTPRequest.h
ASIHTTPRequest.m
ASIDataCompressor.h
ASIDataCompressor.m
ASIDataDecompressor.h
ASIDataDecompressor.m
ASIFormDataRequest.h
ASIInputStream.h
ASIInputStream.m
ASIFormDataRequest.m
ASINetworkQueue.h
ASINetworkQueue.m
ASIDownloadCache.h
ASIDownloadCache.m
对于 iPhone,还要拷贝下列文件:
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
Reachability.h (External/Reachability目录)
Reachability.m(External/Reachability目录)
2、添加依赖库
ASIHTTPRequest依赖于以下5个框架或库:
CFNetwork、SystemConfiguration、MobileCoreServices、CoreGraphics和libz1.2.3。
依次将上述库和框架添加到target的Linked Libraries中。
二、简单的同步请求示例
新建iOS项目,加入必需的源文件和Linked Libraries。往MainWindow.xib中添加一个UIButton,添加相应的outlet与action。编写按钮的Touch up inside代码,并连接到UIButton:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
- (IBAction)goURL { NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; // 构造ASIHTTPRequest对象 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // 开始同步请求 [request startSynchronous]; NSError *erro = [request error]; assert(!erro); // 如果请求成功,返回Response NSString *response = [request responseString]; NSLog(@"%@", response);} |
别忘了在适当的地方导入ASIHTTPRequest:#import "ASIHTTPRequest.h"分别保存IB和Xcode中所做的更改,⌘+B编译。
三、简单的异步请求示例
将上述代码修改为:
|
1
2
3
4
5
6
7
8
9
10
11
|
- (IBAction)goURL { NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // 设定委托,委托自己实现异步请求方法 [request setDelegate: self]; // 开始异步请求 [request startAsynchronous];} |
并 实现一系列委托方法:(别忘了在.h中添加import头文件以及delegate)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
- (IBAction)goURL{ NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // ASIHTTPRequest支持iOS4.0的块语法,可以把委托方法定义到块中 [request setCompletionBlock:^{ // 请求响应结束,返回response NSString *response = [request responseString]; // 对于2进制数据,使用:NSData *response = [request responseData]; NSLog(@"%@", response); }]; [request setFailedBlock:^{ // 请求失败,获取error NSError *error = [request error]; NSLog(@"%@", [error userInfo]); }]; [request startAsynchronous];} |
但此时出现了郁闷的一幕,代码块中的request对象出现警告信息:Capturing 'request' strongly in this block is likely to lead to a retain cycle。看到这个我就知道麻烦了,然后我查了一些资料,但没有很好的解决这个问题,大家可以参考一下这里 Block的Retain Cycle的解决方法。要是有谁知道麻烦说一下,大家相互学习。
转:http://my.oschina.net/iNiL0119/blog/179526
ASIHTTPRequest系列(一):同步和异步请求的更多相关文章
- C# ASP.NET Core使用HttpClient的同步和异步请求
引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...
- ASIHTTP 框架,同步、 异步请求、 上传 、 下载
ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度 ...
- 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第四节:同步与异步请求方式
前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立.本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同. 1.4.1 说结合,无非就是我们如何发送一个 ...
- js中同步与异步请求方式
异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...
- Jquery的同步和异步请求
1 异步请求: 1.1 $.ajax $.ajax({ url : 'your url', data:{name:valu ...
- ASP.NET Core使用HttpClient的同步和异步请求
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.I ...
- Swift3.0:Get/Post同步和异步请求
一.介绍 Get和Post区别: Get是从服务器上获取数据,Post是向服务器发送数据. 对于Get方式,服务端用Request.QueryString获取变量的值,对于Post方式,服务端用Req ...
- $.post 和 $.get 设置同步和异步请求
由于$.post() 和 $.get() 默认是 异步请求,如果需要同步请求,则可以进行如下使用:在$.post()前把ajax设置为同步:$.ajaxSettings.async = false;在 ...
- NSURLConnection和NSMutableURLRequest 实现同步、异步请求
我是走向ios的一个小书童,我有很多不懂的,新鲜的知识去学习,去掌握! 我首先要吐槽一下: 那些不负责的博友!你分享知识本来是好事!可是你直接Control+V就是你的不对了! 尼玛,直接Contro ...
随机推荐
- selnium远程机上传图片遇到的坑
一般上传图片方法采取方案如下: input标签的file类型上传图片,使用对象的sendkeys+路径方法 使用js注入,再用使用对象的sendkeys+路径方法 使用autolt生成的exe,打开对 ...
- Android 6.0 变更
Android 6.0(API 级别 23)除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 如果您之前发布过 Andr ...
- wpf 用户自定义事件传参
//自定义传参 ,对外联系的参数 public class ImageZoomChangedEventArgs : RoutedEventArgs { /// <summary> /// ...
- java innerclasses(内部类)
可以将一个类定义在另一个类的内部,这就是内部类 创建内部类的方式---把类的定义置于外部类的里面 典型的情况是,外部类将有一个方法,该方法返回一个指向内部类的引用,就像在to()和contents() ...
- 网络图片转换到本地并转换成base64位
/** * 网络图片转换到本地并转换成base64位 * @param $url * @return string */ public function imgzhuanhuan($url) { // ...
- SSL单向认证和双向认证说明
SSL单向认证和双向认证说明 一.SSL双向认证具体过程 浏览器发送一个连接请求给安全服务器. 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器. 客户浏览器检查服务器送过来的证书是否是由自己 ...
- js数组遍历some、foreach、map、filter、every、lastIndexOf、indexOf对比
1. [...].some(ck)函数 对数组中每个元素执行一次ck函数,知道某个元素返回true,则直接返回true.如果都返回false,则返回false 检查整个数组中是否有满足ck函数的元素. ...
- Cookie安全漫谈(转)
add by zhj: 我也同意作者的观点,JavaScript 操作 Cookie 是一种不正常的做法:可以用 JavaScript 操作 Cookie 完成的功能,一样可以在服务端来完成. js操 ...
- springmvc springJDBC 简单实训银行账户管理系统
springmvc springJDBC 简单实训银行账户管理系统 1.简单介绍一下,在校时每周结束都会有一次学习总结,简称“实训”,这次实训内容是spring,因为是最近热门框架,我就先从基础方面开 ...
- css细节:尖角处理
在各种网站里面,我们会经常看到类似于这样的尖角:(示例:新浪微博) 它实现的方式有多种,哪种才是最简单的?哪种才是最优秀的?首先我声明一下,我还不清楚这个东西具体叫什么名字(哪位知道还望告知),暂且叫 ...