ASIHTTPRequest 虽然是明日黄花,但是还是稍微归纳一下,理清思路,知道这个曾经的她都能干嘛。

1. ASI基于底层的 CFNetworking 框架,运行效率很高。

2. 黄金搭档:ASI + SBJson ,ASI用来网络请求,SBJson用来解析服务器返回的数据。

3.ASI的使用参考:

1> 宝玉的博客:

 
2> oxchina.net开源中国社区

基本使用:

1.发送同步请求;

包含主文件  #import "ASIHTTPRequest.h"

// 1.创建请求
NSURL *url = [NSURL URLWithString:@"http://192.168.1.111:8080/XZServer/login?username=123&pwd=123"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = ; // 超时 // 2.发送同步请求
[request startSynchronous]; // 3.获得错误信息
NSError *error = [request error];
if (error) {
NSLog(@"出错了");
} else {
// 获得服务器的响应
NSData *data = [request responseData];
} // [request responseData]

2.发送异步请求;

// 1.创建请求
NSURL *url = [NSURL URLWithString:@"http://192.168.1.103:8080/XZServer/login?username=123456&pwd=123456"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
request.timeOutSeconds = ; // 超时 // 2.设置代理
request.delegate = self; // 3.发送异步请求
[request startAsynchronous]; // ASI通过代理的方式处理异步请求,请求成功、失败都会通知代理
// 代理需要遵守ASIHTTPRequestDelegate协议

3.ASIHTTPRequestDelegate:

接收到服务器的数据就调用
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data 请求失败就调用
- (void)requestFailed:(ASIHTTPRequest *)request 请求成功完毕就调用
- (void)requestFinished:(ASIHTTPRequest *)request 注意:应当在控制器被销毁的时候,取消请求
[request clearDelegatesAndCancel];

ASI 的 SEL 回调:

@property (atomic, assign) SEL didStartSelector;
@property (atomic, assign) SEL didReceiveResponseHeadersSelector;
@property (atomic, assign) SEL willRedirectSelector;
@property (atomic, assign) SEL didFinishSelector;
@property (atomic, assign) SEL didFailSelector;
@property (atomic, assign) SEL didReceiveDataSelector;

ASI 的 block 回调:

- (void)setStartedBlock:(ASIBasicBlock)aStartedBlock;
- (void)setHeadersReceivedBlock:(ASIHeadersBlock)aReceivedBlock;
- (void)setCompletionBlock:(ASIBasicBlock)aCompletionBlock;
- (void)setFailedBlock:(ASIBasicBlock)aFailedBlock; - (void)setBytesReceivedBlock:(ASIProgressBlock)aBytesReceivedBlock;
- (void)setBytesSentBlock:(ASIProgressBlock)aBytesSentBlock;
- (void)setDownloadSizeIncrementedBlock:(ASISizeBlock) aDownloadSizeIncrementedBlock;
- (void)setUploadSizeIncrementedBlock:(ASISizeBlock) anUploadSizeIncrementedBlock; - (void)setDataReceivedBlock:(ASIDataBlock)aReceivedBlock;
- (void)setAuthenticationNeededBlock:(ASIBasicBlock)anAuthenticationBlock;
- (void)setProxyAuthenticationNeededBlock:(ASIBasicBlock)aProxyAuthenticationBlock;
- (void)setRequestRedirectedBlock:(ASIBasicBlock)aRedirectBlock; typedef void (^ASIBasicBlock)(void);
typedef void (^ASIHeadersBlock)(NSDictionary *responseHeaders);
typedef void (^ASISizeBlock)(long long size);
typedef void (^ASIProgressBlock)(unsigned long long size, unsigned long long total);
typedef void (^ASIDataBlock)(NSData *data);

获得服务器的响应:

获得状态码\状态信息
@property (atomic, assign,readonly) int responseStatusCode;
@property (atomic, retain,readonly) NSString *responseStatusMessage; 获得响应头
@property (atomic, retain) NSDictionary *responseHeaders; 获得实体内容(响应体)
- (NSData *)responseData;
- (NSString *)responseString;

发送POST请求:

包含头文件:#import "ASIFormDataRequest.h"

// 1.创建请求
NSURL *url = [NSURL URLWithString:@"http://192.168.1.103:8080/XZServer/login"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; // 2.设置请求参数
[request addPostValue:@"" forKey:@"username"];
[request addPostValue:@"" forKey:@"pwd"];
// 注意addPostValue和setPostValue的区别

文件上传:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

// 添加普通的请求参数
[request addPostValue:@"MJ" forKey:@"username"]; // 添加文件参数
NSString *file = [[NSBundle mainBundle] pathForResource:@"musicplayer.png" ofType:nil];
[request addFile:file forKey:@"file"];
// 或者
UIImage *image = [UIImage imageNamed:@"musicplayer"];
NSData *data = UIImagePNGRepresentation(image);
[request addData:data withFileName:@"test.png" andContentType:@"image/png" forKey:@"file"];

文件上传 – 添加文件参数

有2种添加文件参数的方法:

>通过文件的全路径
- (void)addFile:(NSString *)filePath forKey:(NSString *)key
- (void)addFile:(NSString *)filePath withFileName:(NSString *)fileName andContentType:(NSString *)contentType forKey:(NSString *)key >通过文件的具体数据
- (void)addData:(id)data withFileName:(NSString *)fileName andContentType:(NSString *)contentType forKey:(NSString *)key

文件下载:

// 设置缓存路径
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filepath = [caches stringByAppendingPathComponent:@"test.mp4"];
request.downloadDestinationPath = filepath;
// 设置下载代理
request.downloadProgressDelegate = self.progressView; 大文件支持断点续传
// 设置文件的临时路径
request.temporaryFileDownloadPath = tmpFilepath;
// 设置支持断点续传
request.allowResumeForFileDownloads = YES;

监听文件上传\下载进度

成为ASI的代理
- (void)setUploadProgressDelegate:(id)newDelegate 遵守ASIProgressDelegate协议,实现协议方法
- (void)setProgress:(float)newProgress;

缓存:

ASI也提供了数据缓存功能
它只对Get请求的响应数据进行缓存
被缓存的数据必需是成功的200请求
使用ASIDownloadCache类管理缓存 常见ASIDownloadCache用法
取得默认的缓存对象
ASIDownloadCache *cache = [ASIDownloadCache sharedCache]; 设置缓存策略
- (void)setDefaultCachePolicy:(ASICachePolicy)cachePolicy 设置缓存路径
- (void)setStoragePath:(NSString *)path

缓存策略 - ASICachePolicy

缓存策略:什么时候进行缓存,缓存数据的利用方式。可用组合使用
默认缓存策略:如果存在未过期的缓存数据,则使用缓存;否则进行网络请求,判断服务器版本与本地版本是否一样,如果一样,则使用缓存。
如果服务器有新版本,会进行网络请求,并更新本地缓存
ASIUseDefaultCachePolicy
ASIAskServerIfModifiedWhenStaleCachePolicy 与默认缓存大致一样,区别仅是每次请求都会 去服务器判断是否有更新
ASIAskServerIfModifiedCachePolicy 不读取缓存数据
ASIDoNotReadFromCacheCachePolicy 不缓存数据,不写缓存
ASIDoNotWriteToCacheCachePolicy 如果有缓存,不管其过期与否,总会拿来使用,没有缓存就重新请求
ASIOnlyLoadIfNotCachedCachePolicy 有缓存,拿来使用,如果没有缓存,请求将被取消(没有错误信息)
ASIDontLoadCachePolicy 请求失败时,如果有缓存则返回缓存(经常被用来与其它选项组合使用)
ASIFallbackToCacheIfLoadFailsCachePolicy

缓存某个请求:

// 设置缓存策略
ASIDownloadCache *cache = [ASIDownloadCache sharedCache];
[cache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy]; // 使用缓存
[request setDownloadCache:cache]; // 设置缓存的存储策略(永久存储)
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

ASIHTTPRequest缓存的存储策略

缓存的存储策略:缓存需要保存多长时间
默认策略,基于session的缓存数据存储,当下次运行或[ASIHTTPRequest clearSession]时,缓存将失效(内存缓存)
ASICacheForSessionDurationCacheStoragePolicy 缓存数据永久保存在本地(硬盘缓存)
ASICachePermanentlyCacheStoragePolicy

缓存所有请求:

// 设置缓存策略
ASIDownloadCache *cache = [ASIDownloadCache sharedCache];
[cache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy]; // 使用缓存
[ASIHTTPRequest setDefaultCache:cache];

缓存的其他特性:

设置缓存的有效期
[request setSecondsToCache: * * * ]; // 缓存7天 判断数据是否从缓存读取的
BOOL useCache = [request didUseCachedResponse];

ASIHTTPRequest 其他特性:

实际上ASIHTTPRequest继承自NSOperation,意味着
可以将多个 ASIHTTPRequest 放到NSOperationQueue中,同时管理多个请求
可以设置请求之间的依赖
… … ASIFormDataRequest 继承自 ASIHTTPRequest

其他用法:

现在是否有网络请求在处理中
[ASIHTTPRequest isNetworkInUse]; 当正在请求时,是否要在状态栏显示联网状态(转圈圈)
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES]; 当应用后台运行时,是否仍然继续处理网络请求
request.shouldContinueWhenAppEntersBackground = YES; 设置请求超时后重试的次数
request.numberOfTimesToRetryOnTimeout = ; // 重试2次

网络编程--ASI--(ASIHTTPRequest)介绍的更多相关文章

  1. linux网络编程--网络编程的基本函数介绍与使用【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/17538499 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览 ...

  2. UNIX网络编程-基本API介绍(二)

    参考链接:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx 1.getsockname和getpeername getsocknam ...

  3. linux网络编程之进程间通信介绍

    从今天起,开始学习进程间通信相关的东东,关于socket的编程先告一段落了,在学习进程间通信之前,首先先要了解一些概念,所以,这次不开始真正的代码编写,先纯理论,理解了为之后的更深入的学习可以打下良好 ...

  4. UNIX网络编程-基本API介绍(一)

    1.基本结构 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束. 1. ...

  5. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  6. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  7. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  8. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  9. JAVA网络编程【转】出处不详

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  10. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

随机推荐

  1. Mac下JDK安装配置

    首先可以通过官网下载JDK:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html,至于下什么版本根 ...

  2. 动态dynamically变更母版_Layout页body标签css的class

    这个功能演示是Insus.NET最近想实现的一个功能,就是动态dynamically变更母版_Layout页body标签的样式css的class. 很多视图共同一个母版_Layout页,但是某一个视图 ...

  3. Linux移植的一般过程

    前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程. 一开始的UBOOT的移植不多说了.UBOOT最后有两种方式进入Linux,一种是使用uImage, ...

  4. "Hello World!" for the NetBeans IDE

    "Hello World!" for the NetBeans IDE It's time to write your first application! These detai ...

  5. Nhibernate的第一个实例

    第一个NhIbernate程序 1.目的: a) 链接到oracle数据库 b) 增删改 c) 基本查询.sql查询 d) 视图查询 e) 使用存储过程 f) 多表查询.级联查询 g) 级联增删改 2 ...

  6. object references an unsaved transient instance - save the transient instance before flushing错误

    异常1:not-null property references a null or transient value解决方法:将“一对多”关系中的“一”方,not-null设置为false(参考资料: ...

  7. final static 深度解析

    function test(){ var a = b = 10; } test( ); alert(b); 由上一篇博客说起,最后输出的是10.引起歧义的原因是全局变量和局部变量的关系.顺着这个话题, ...

  8. 基础-WeakReference

    一.概述 为了更好的理解WeakHashMap的原理,我们有必要先来了解一下WeakReference的作用及实现原理.Java中有一个专门的包java.lang.ref,里面定义了我们通常所说的几种 ...

  9. Array数组基础

    数组的定义 数组(array)是按次序排列的一组值,单个值称为元素,它们的位置都有编号(从0开始).整个数组用方括号表示. var arr = ['a', 'b', 'c']; 上面代码中的a.b.c ...

  10. 【FFmpeg】Windows下FFmpeg编译

    由于FFmpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译,需要在Windows下配置一个类 ...