网络编程--ASI--(ASIHTTPRequest)介绍
ASIHTTPRequest 虽然是明日黄花,但是还是稍微归纳一下,理清思路,知道这个曾经的她都能干嘛。
1. ASI基于底层的 CFNetworking 框架,运行效率很高。
2. 黄金搭档:ASI + SBJson ,ASI用来网络请求,SBJson用来解析服务器返回的数据。
3.ASI的使用参考:
1> 宝玉的博客:
基本使用:
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)介绍的更多相关文章
- linux网络编程--网络编程的基本函数介绍与使用【转】
本文转载自:http://blog.csdn.net/yusiguyuan/article/details/17538499 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览 ...
- UNIX网络编程-基本API介绍(二)
参考链接:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx 1.getsockname和getpeername getsocknam ...
- linux网络编程之进程间通信介绍
从今天起,开始学习进程间通信相关的东东,关于socket的编程先告一段落了,在学习进程间通信之前,首先先要了解一些概念,所以,这次不开始真正的代码编写,先纯理论,理解了为之后的更深入的学习可以打下良好 ...
- UNIX网络编程-基本API介绍(一)
1.基本结构 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束. 1. ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- JAVA的网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- JAVA网络编程【转】出处不详
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 【转】JAVA之网络编程
转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...
随机推荐
- 前端模块化开发之seaJs
了解后端语言的童鞋一定听过模块化开发的概念,比如java.python等后端语言都有自己的模块化特性,然而和后端语言相比,javascript还尚未实现模块化的功能,虽然之后的更高版本可能引入模块化开 ...
- EDNS
随着业务的复杂化和多样化,RFC1035中定义的DNS消息格式和它支持的消息内容已经不足以满足一些DNS服务器的需求,于是,RFC2671中提出了一种扩展DNS机制EDNS(Extension Mec ...
- 设置与获取Cookie
自己编写的一个Cookie设置与获取函数,大家有什么感觉需要改进的地方,请告知与我,我一定虚心接受. JavaScript - Code: function setCookie(name,value, ...
- Android SDK Android NDK Android Studio 官方下载地址
2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...
- nodejs中exports与module.exports的实践
只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等&g ...
- Access is denied
昨天有学习ASP.NET MVC的publish和IIS发行网站<简单的ASP.NET MVC发布>http://www.cnblogs.com/insus/p/4466200.html ...
- Winform开发中常见界面的DevExpress处理操作
我们在开发Winform程序的时候,需要经常性的对界面的一些控件进行初始化,或者经常简单的封装,以方便我们在界面设计过程中反复使用.本文主要介绍在我的一些项目中经常性的界面处理操作和代码,以便为大家开 ...
- ORM查询语言(OQL)简介--高级篇:脱胎换骨
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...
- 值得 Web 开发人员学习的20个 jQuery 实例教程
这篇文章挑选了20个优秀的 jQuery 实例教程,这些 jQuery 教程将帮助你把你的网站提升到一个更高的水平.其中,既有网站中常用功能的的解决方案,也有极具吸引力的亮点功能的实现方法,相信通过对 ...
- 20个免费的 AngularJS 资源和开发教程
曾经,jQuery 无疑是最受欢迎的开源的 JavaScript 库,如今它有了很多的竞争对手,像 AngularJS.React.KnockoutJS 等等.在这里,我想重点关注一下 Angular ...