前言

  • 使用 iOS SDK 中的 HTTP 网络请求 API,相当的复杂,调用很繁琐,ASIHTTPRequest 就是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 API,外号 “HTTP终结者”,用 Objective-C 编写,运行效率很高,可以很好的应用在 Mac OS X 系统和 iOS 平台的应用程序中,ASIHTTPRequest 适用于基本的 HTTP 请求,和基于 REST 的服务之间的交互。可惜作者早已停止更新,有一些潜在的 BUG 无人去解决,很多公司的旧项目里面都残留着它的身影,以前的很多 iOS 项目都是 ASI + SBJson,会不会用 ASI,可以算是检验是否为老牌 iOS 程序员的标准之一。从 iOS 9 开始 CFNetwork 相关的类和方法开始被废弃,可以使用 AFNetworking 替换 ASIHTTPRequest 的使用。在 iOS 9+ 中使用 ASIHTTPRequest 无需对 App Transport Security Settings 添加设置。

1、ASIHTTPRequest

1.1 ASI 主要特色

  • 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作。
  • 下载的数据,可存储到内存中或直接存储到磁盘中。
  • 能上传本地文件到服务端。
  • 可以方便的访问和操作请求和返回的 Http 头信息。
  • 可以获取到上传或下载的进度信息,为应用程序提供更好的体验。
  • 支持上传或下载队列,并且可获取队列的进度信息。
  • 支持基本、摘要和 NTLM 身份认证,在同一会话中授权凭证会自动维持,并且可以存储在 Keychain(Mac 和 iOS 操作系统的密码管理系统)中。
  • 支持 Cookie。
  • 当应用(iOS 4+)在后台运行时,请求可以继续运行。
  • 支持 GZIP 压缩数据。
  • 内置的 ASIDownloadCache 类,可以缓存请求返回的数据,这样即使没有网络也可以返回已经缓存的数据结果。
  • ASIWebPageRequest 可以下载完整的网页,包括包含的网页、样式表、脚本等资源文件,并显示在 UIWebView /WebView 中。任意大小的页面都可以无限期缓存,这样即使没有网络也可以离线浏览。
  • 支持客户端证书。
  • 支持通过代理发起 Http 请求。
  • 支持带宽限制。在 iOS 平台,可以根据当前网络情况来自动决定是否限制带宽,例如当使用 WWAN(GPRS/Edge/3G) 网络时限制,而当使用 WIFI 时不做任何限制。
  • 支持断点续传。
  • 支持同步和异步请求。

1.2 AFN 与 ASI 的区别

  • 1、底层实现

    • 1)AFN 的底层实现基于 OC 的 NSURLConnection 和 NSURLSession
    • 2)ASI 的底层实现基于纯 C 语言的 CFNetwork 框架
    • 3)因为 NSURLConnection 和 NSURLSession 是在 CFNetwork 之上的一层封装,因此 ASI 的运行性能高于 AFN
  • 2、对服务器返回的数据处理

    • 1)ASI 没有直接提供对服务器数据处理的方式,直接返回的是 NSData/NSString
    • 2)AFN 提供了多种对服务器数据处理的方式
      • (1) JSON 处理-直接返回 NSDictionary 或者 NSArray
      • (2) XML 处理-返回的是 xml 类型数据,需对其进行解析
      • (3) 其他类型数据处理
  • 3、监听请求过程

    • 1)AFN 提供了success 和 failure 两个 block 来监听请求的过程(只能监听成功和失败)

      • success : 请求成功后调用
      • failure : 请求失败后调用
    • 2)ASI 提供了 3 套方案,每一套方案都能监听请求的完整过程(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
      • 成为代理,遵守协议,实现协议中的代理方法
      • 成为代理,不遵守协议,自定义代理方法
      • 设置 block
  • 4、在文件下载和文件上传的使用难易度

    • 1)AFN

      • 不容易实现监听下载进度和上传进度
      • 不容易实现断点续传
      • 一般只用来下载不大的文件
    • 2)ASI
      • 非常容易实现下载和上传
      • 非常容易监听下载进度和上传进度
      • 非常容易实现断点续传
      • 下载大文件或小文件均可
    • 3)实现下载上传推荐使用 ASI
  • 5、网络监控

    • 1)AFN 自己封装了网络监控类,易使用
    • 2)ASI 使用的是 Reachability,因为使用 CocoaPods 下载 ASI 时,会同步下载 Reachability,但 Reachability 作为网络监控使用较为复杂(相对于 AFN 的网络监控类来说)
    • 3)推荐使用 AFN 做网络监控 AFNetworkReachabilityManager
  • 6、ASI 提供的其他实用功能

    • 1)控制信号旁边的圈圈要不要在请求过程中转
    • 2)可以轻松地设置请求之间的依赖:每一个请求都是一个 NSOperation 对象
    • 3)可以统一管理所有请求(还专门提供了一个叫做 ASINetworkQueue 来管理所有的请求对象)
      • 暂停/恢复/取消所有的请求
      • 监听整个队列中所有请求的下载进度和上传进度

2、ASIHTTPRequest 的使用

2.1 添加 ASIHTTPRequest

  • Github 网址:

  • ASIHTTPRequest 系统需求:

    1. ASIHTTPRequest Version | Minimum iOS Target | Target Notes

    ---------------------------|--------------------------|---------------------

    1.8.1 -> 1.8.2 | iOS 3.0+ |

    0.2 -> 1.8.0 | |

  • ASIHTTPRequest 使用 MRC

  • Objective-C

    1. // 添加系统库文件
    2. CFNetwork.framework
    3. SystemConfiguration.framework
    4. MobileCoreServices.framework
    5. CoreGraphics.framework
    6. libz.1.1.3.tbd
    7. libxml2.2.tbd
    8. // 添加第三方库文件
    9. ASIHTTPRequest-1.8.2
    10. // 在 TARGETS -> Builed Settings -> Search Paths -> Header Search Paths 中添加文件路径
    11. /usr/include/libxml2
    12. // 在 TARGETS -> Build Phases -> Compile Sources -> ...in .../ASIHTTPRequest 后添加
    13. -fno-objc-arc
    14. // 包含头文件
    15. #import "ASIHTTPRequest.h"
    16. #import "ASIFormDataRequest.h"

2.2 ASIHTTPRequest 的设置

  • Objective-C

    1. // 设置请求头
    2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]];
    3. [request addRequestHeader:@"Referer" value:@"http://www.dreamingwish.com/"];
    4. // 设置应用后台运行时是否仍然请求数据
    5. request.shouldContinueWhenAppEntersBackground = YES;
    6. // 设置请求超时时重试的次数
    7. request.numberOfTimesToRetryOnTimeout = 3;
    8. // 设置 KeepAlive 支持
    9. // Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes
    10. request.persistentConnectionTimeoutSeconds = 120;
    11. // Disable persistent connections entirely
    12. request.shouldAttemptPersistentConnection = NO;
    13. // 设置是否显示网络请求信息在 status bar 上
    14. [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO];
    15. // 网络状态检查
    16. BOOL isNetworkInUse = [ASIHTTPRequest isNetworkInUse];

3、ASI 同步 GET 请求

  • 这是 ASIHTTPRequest 最简单的一种使用模式,发送 startSynchronous 消息后即开始在同一线程中执行 HTTP 请求,线程将一直等待直到请求结束(请求成功或者失败)。通过检查 error 属性可以判断请求是否成功或者有错误发生。

  • 要获取返回的文本信息,调用 responseString 方法。如果下载的是二进制文件,例如图片、MP3,则调用 responseData 方法,可以得到一个 NSData 对象。

  • 一般情况下,应该优先使用异步请求代替同步请求,当在主线程中使用 ASIHTTPRequest 同步请求会阻塞主线程的执行,这导致用户界面不响应用户操作,任何动画都会停止渲染,直到请求完成。

  • Objective-C

    • 数据请求

      1. NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
      2. // 创建请求
      3. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
      4. // 设置超时时间,可不设置,使用默认
      5. request.timeOutSeconds = 5;
      6. // 发送同步请求
      7. [request startSynchronous];
      8. // 获得错误信息
      9. NSError *error = [request error];
      10. // 网络请求失败
      11. if (error) {
      12. // 网络请求成功
      13. NSLog(@"网络请求失败:\n%@", error);
      14. } else {
      15. // 获得服务器的响应,字符串格式
      16. NSString *responseString = [request responseString];
      17. NSLog(@"网络请求成功:\n%@", responseString);
      18. // 获得服务器的响应,NSData 格式
      19. NSData *responseData = [request responseData];
      20. textView.text = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
      21. }
    • 文件下载

      • 通过设置 request 的 setDownloadDestinationPath,可以设置下载文件用的下载目标目录。首先,下载过程文件会保存在 temporaryFileDownloadPath 目录下。如果下载完成会做以下事情:

        • 1,如果数据是压缩的,进行解压,并把文件放在 downloadDestinationPath 目录中,临时文件被删除。
        • 2,如果下载失败,临时文件被直接移到 downloadDestinationPath 目录,并替换同名文件。
      • 如果你想获取下载中的所有数据,可以实现 delegate 中的 request:didReceiveData:方法。但如果你实现了这个方法,request 在下载完后,request 并不把文件放在 downloadDestinationPath中,需要手工处理。

        1. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/wp-content/uploads/2011/10/asihttprequest-auth.png"];
        2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        3. // 设置文件存储路径
        4. [request setDownloadDestinationPath:@"/Users/JHQ0228/Desktop/asi.png"];
        5. [request startSynchronous];
        6. // 获得错误信息
        7. NSError *error = [request error];
        8. // 网络请求失败
        9. if (error) {
        10. NSLog(@"网络请求失败:\n%@", error);
        11. } else {
        12. // 网络请求成功
        13. NSLog(@"网络请求成功:\n");
        14. }

4、ASI 异步 GET 请求

  • 请求在后台线程中运行,当请求执行完后再通知调用的线程。这样不会导致主线程进行网络请求时,界面被锁定等情况。

    • 协议方式

      • 在这里实现了两个 delegate 的方法,当数据请求成功时会调用 requestFinished,请求失败时(如网络问题或服务器内部错误)会调用 requestFailed。

        1. NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
        2. // 创建请求
        3. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        4. // 设置超时时间,可不设置,使用默认
        5. request.timeOutSeconds = 5;
        6. // 设置代理,需遵守 <ASIHTTPRequestDelegate> 协议
        7. request.delegate = self;
        8. // 发送异步请求
        9. [request startAsynchronous];
        10. // 网络请求成功,协议方法
        11. - (void)requestFinished:(ASIHTTPRequest *)request {
        12. }
        13. // 网络请求失败,协议方法
        14. - (void)requestFailed:(ASIHTTPRequest *)request {
        15. }
    • Block 方式

      • 在平台支持情况下,ASIHTTPRequest 1.8 以上支持 block。

        1. NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
        2. // 创建请求,加 __weak 除去 block 循环调用警告
        3. __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        4. // 设置超时时间,可不设置,使用默认
        5. request.timeOutSeconds = 5;
        6. // 发送异步请求
        7. [request startAsynchronous];
        8. // 网络请求成功
        9. [request setCompletionBlock:^{
        10. }];
        11. // 网络请求失败
        12. [request setFailedBlock:^{
        13. }];

5、ASI POST 请求

  • POST 表单

    • ASIFormDataRequest,模拟 Form 表单提交,其提交格式与 Header 会自动识别。文件中的数据是需要时才从磁盘加载,所以只要 web server 能处理,那么上传大文件是没有问题的。

      1. // 通常数据是以 ’application/x-www-form-urlencoded’ 格式发送的,如果上传了二进制数据或者文件,那么格式将自动变为 ‘multipart/form-data’。
      2. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
      3. // 没有文件
      4. [request setPostValue:@"Ben" forKey:@"first_name"];
      5. [request setPostValue:@"Copsey" forKey:@"last_name"];
      6. // 发送文件
      7. [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
      8. // 数据的 mime 头是自动判定的,但是如果你想自定义mime头,那么这样:
      9. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
      10. // Upload a file on disk
      11. [request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];
      12. // Upload an NSData instance
      13. NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"myphoto.jpg"]);
      14. [request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];
      15. // 你可以使用 addPostValue 方法来发送相同 name 的多个数据:
      16. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
      17. [request addPostValue:@"Ben" forKey:@"names"];
      18. [request addPostValue:@"George" forKey:@"names"];
  • PUT 请求、自定义 POST 请求

    • 如果你想发送 PUT 请求,或者你想自定义 POST 请求,使用 appendPostData: 或者 appendPostDataFromFile:

      1. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
      2. [request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]];
      3. // Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:
      4. [request setRequestMethod:@"PUT"];

iOS - ASIHTTPRequest 网络请求的更多相关文章

  1. ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)

    当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你 ...

  2. iOS开发网络请求——大文件的多线程断点下载

    iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...

  3. iOS - Alamofire 网络请求

    前言 Alamofire 是 Swift 语言的 HTTP 网络开发工具包,相当于 Swift 实现 AFNetworking 版本.当然,AFNetworking 非常稳定,在 Mac OSX 与 ...

  4. iOS - AFNetworking 网络请求

    前言 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的.但是,在绝大部分下我们所需要访 ...

  5. iOS - NSURLSession 网络请求

    前言 NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) @interface NSURLSession : NSObject @available(iOS ...

  6. iOS - NSURLConnection 网络请求

    前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...

  7. iOS之网络请求NSURLSession剖析

    2013年的WWDC大会上,苹果推出了NSURLSession,对Foundation URL加载系统进行了彻底的重构,提供了更丰富的API来处理网络请求,如:支持http2.0协议.直接把数据下载到 ...

  8. iOS 多网络请求同步并发

    iOS中经常会用到多线程,在多线程中有一个线程组的概念(group),创建多个线程组任务,多组任务都完成之后,就会进入dispatch_group_notify队列中. 同时多线程中还有一个信号量的概 ...

  9. iOS 原生网络请求(推荐使用AFNetWorking库)

    .     同步GET请求       //第一步,创建URL       NSURL *url = [NSURL URLWithString:@"http://api.hudong.com ...

随机推荐

  1. mac下多个php版本快速切换的方法是怎么样

    一.使用brew安装php多版本方法# brew install php56# brew install php70二.安装切换工具# brew install php-version# source ...

  2. 20145227《Java程序设计》第2次实验报告

    20145227<Java程序设计>第2次实验报告 实验步骤与内容 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 ...

  3. c# 中crystal report输出PDF文件

    工程中引入以下crystal report的类库crystaldecisions.crystalreports.enginecrystaldecisions.reportsourcecrystalde ...

  4. 使用opencv自带的融合函数

    [wiki,blog]使用opencv自带的融合函数 [wiki,blog]使用opencv自带的融合函数 /*M/////////////////////////////////////////// ...

  5. 异步I/O

    http://blog.csdn.net/gotosola/article/details/7412409 Linux2.6异步I/O AIO的基本思想:  允许进程发起很多I/O操作,而不用阻塞或等 ...

  6. TSP问题

    之前写过一道类似的题目,Uva 1347. http://www.cnblogs.com/TreeDream/p/5981535.html 这个题目和TSP问题已经很接近了,只是描述的奇奇怪怪的,从最 ...

  7. ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)

    单独查看内存使用情况的命令:free -m查看内存及cpu使用情况的命令:top也可以安装htop工具,这样更直观,安装命令如下:sudo apt-get install htop安装完后,直接输入命 ...

  8. linux 开启wifi热点

    1,在网络连接管理中创建一个wifi连接,点击 Add,然后选Wi-Fi 2,设置wifi热点名字.wifi接连名字 3,设置 Mode 选 Ad-hoc,其它默认. 4,在 Wi-Fi Securi ...

  9. 你不知道的This和Class

    Oh no....我的This又丢失了??? 为什么我用Class'实例化'出来的对象会相互影响??? ####这些问题都是因为JS的运行机制造成的.在JS中所有的一切都是对象,而this是对象的一个 ...

  10. VC++ 工程添加 Unicode Debug和Unicode Release编译支持

    转载:http://blog.csdn.net/djhdu/article/details/171766 转载:http://blog.163.com/long_lh/blog/static/2769 ...