iOS - AFNetworking 网络请求

前言

  • 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的。但是,在绝大部分下我们所需要访问的 Web 页面则是属于那种受到权限保护的页面,并不是有一个简单的 URL 可以访问的。这就涉及到了 Session 和 Cookie 的处理了,在此时使用 NSURLConnection 也是能够达到要求的,只是其中处理起来的复杂度和难度就提升了。为了更好的处理向 Web 站点的请求,包括处理 Session,Cookie 等细节问题,使用 AFNetworking 则是更好的选择。

    • 1) Session:中文有译作时域的,就是指某个客户端从访问服务器起到停止访问这一段的时间间隔被称为时域。
    • 2) Cookie:由服务器发送给客户端,把 Cookie 的 key:value 值储存在本地文件夹下,当下次请求的时候能够直接发送 Cookie 获得权限验证。

1、AFNetworking

1.1 AFNetworking 特点

  • AFNetworking 是一个讨人喜欢的网络库,适用于 iOS,Mac OS X 以及 Watch OS。
  • AFNetworking 构建在 NSURLSession,NSOperation,以及其他熟悉的 Foundation 技术之上。它拥有良好的架构,丰富的 API,以及模块化构建方式,使得使用起来非常轻松。
  • AFNetworking 可以用于发送 HTTP 请求,接收 HTTP 的响应,但是不会缓存服务器的响应,不能执行 HTML 页面中的 JAvascript 代码。
  • AFNetworking 内置支持 JSON,Plist 文件和 XML 文件的半自动序列化和反序列化,可以对 JSON 格式的请求响应数据自动做反序列化,XML 格式数据需要手动反序列化,使用比较方便。
  • AFNetworking 中回调函数将在主线程中进行,程序员不需要关心线程间通讯问题。
  • AFNetworking 具有完善的错误处理机制。

1.2 AFNetworking 官方使用建议

  • 建立 AFHTTPSesssionManager 的单例子类,统一管理全局的所有网络访问。

    • NetworkTools.h

          #import <AFNetworking/AFNetworking.h>
      
          @interface NetworkTools : AFHTTPSessionManager
      
          + (instancetype)sharedNetworkTools;
      
          @end
    • NetworkTools.m

          @implementation NetworkTools
      
          + (instancetype)sharedNetworkTools {
              static NetworkTools *tools;
      
              static dispatch_once_t onceToken;
              dispatch_once(&onceToken, ^{
      
                  // baseURL 的目的,就是让后续的网络访问直接使用 相对路径即可,baseURL 的路径一定要有 / 结尾
                  NSURL *baseURL = [NSURL URLWithString:@"http://c.m.163.com/"];
      
                  NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
      
                  tools = [[self alloc] initWithBaseURL:baseURL sessionConfiguration:config];
      
                  // 修改 解析数据格式 能够接受的内容类型 - 官方推荐的做法,民间做法:直接修改 AFN 的源代码
                  tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", 
                                                                                          @"text/json", 
                                                                                          @"text/javascript", 
                                                                                          @"text/html", 
                                                                                          nil];
              });
              return tools;
          }
      
          @end

1.3 AFNetworking 系统需求

AFNetworking Version Minimum iOS Target Target Notes
3.x iOS 7 Xcode 7+ is required. NSURLConnectionOperation support has been removed.
2.6 -> 2.6.3 iOS 7 Xcode 7+ is required.
2.0 -> 2.5.4 iOS 6 Xcode 5+ is required. NSURLSession subspec requires iOS 7 or OS X 10.9.
1.x iOS 5
0.10.x iOS 4

1.4 AFNetworking 框架结构

  • 1) V 2.5.4:

        NSURLConnection                                             对 NSURLConnection 网络请求的封装(iOS 9.0 DEPRECATED)
    
            AFURLConnectionOperation
            AFHTTPRequestOperation
            AFHTTPRequestOperationManager
    
        NSURLSession                                                对 NSURLSession 网络请求的封装(iOS 7.0 AVAILABLE)
    
            AFURLSessionManager
            AFHTTPSessionManager
    
        Serialization                                               序列化 & 反序列化 格式
    
            <AFURLRequestSerialization>                              发送给服务器的数据格式(序列化)
                AFHTTPRequestSerializer                               二进制           默认
                AFJSONRequestSerializer                               JSON            POST JSON
                AFPropertyListRequestSerializer                       Plist           苹果专有,极少用
    
            <AFURLResponseSerialization>                             从服务器接收的数据格式(反序列化)
                AFHTTPResponseSerializer                              二进制
                AFJSONResponseSerializer                              JSON            默认
                AFXMLParserResponseSerializer                         XMLParser       SAX 解析
                AFXMLDocumentResponseSerializer (Mac OS X)            XMLDocument     DOM 解析
                AFPropertyListResponseSerializer                      Plist           苹果专有,极少用
                AFImageResponseSerializer                             Image           图片
                AFCompoundResponseSerializer                          Compound        组合的
    
        Additional Functionality                                     辅助功能
    
            AFSecurityPolicy                                          安全策略
            AFNetworkReachabilityManager                              网络状态监测
    
        UIKit+AFNetworking                                           AFNetworking 为相应的 UIKit 控件添加的分类。
  • 2) V 3.1.0:

        NSURLSession                                                对 NSURLSession 网络请求的封装(iOS 7.0 AVAILABLE)
    
            AFURLSessionManager
            AFHTTPSessionManager
    
        Serialization                                               序列化 & 反序列化 格式
    
            <AFURLRequestSerialization>                              发送给服务器的数据格式(序列化)
                AFHTTPRequestSerializer                               二进制           默认
                AFJSONRequestSerializer                               JSON            POST JSON
                AFPropertyListRequestSerializer                       Plist           苹果专有,极少用
    
            <AFURLResponseSerialization>                             从服务器接收的数据格式(反序列化)
                AFHTTPResponseSerializer                              二进制
                AFJSONResponseSerializer                              JSON            默认
                AFXMLParserResponseSerializer                         XMLParser       SAX 解析
                AFXMLDocumentResponseSerializer (Mac OS X)            XMLDocument     DOM 解析
                AFPropertyListResponseSerializer                      Plist           苹果专有,极少用
                AFImageResponseSerializer                             Image           图片
                AFCompoundResponseSerializer                          Compound        组合的
    
        Additional Functionality                                     辅助功能
    
            AFSecurityPolicy                                          安全策略
            AFNetworkReachabilityManager                              网络状态监测
    
        UIKit+AFNetworking                                           AFNetworking 为相应的 UIKit 控件添加的分类。
  • 3)NSURLConnection 网络请求封装:

        iOS 9.0 DEPRECATED
    
        1> AFHTTPRequestOperationManager:
    
            属性:
                requestSerializer   :设置请求的数据格式
                responseSerializer  :设置响应的数据格式
    
                reachabilityManager :网络连接状态管理器,监控网络连接状态
    
            方法:
                HTTPRequestOperationWithRequest:如果需要在请求中设置额外的属性,例如:身份验证,提前准备好 request ,调用此方法就可以了
    
                manager :实例化 HTTP Reuqest 管理器
    
                GET     :GET 请求
                HEAD    :HEAD 请求
                POST    :POST 请求,constructingBodyWithBlock:POST 上传文件用的
                PUT     :PUT 请求
                PATCH   :PATCH 请求,RESTFul 的一个方法,极少用
                DELETE  :DELETE 请求
    
                所有的方法:参数字典
                           成功回调
                           失败回调
                           URL 都是使用字符串来传递的
  • 4) NSURLSession 网络请求封装:

        iOS 7.0 AVAILABLE
    
        1> 说明:
    
            基于指定的 NSURLSessionConfiguration 创建并管理一个 NSURLSession 对象。
            遵守 NSURLSessionTaskDelegate、NSURLSessionDataDelegate、NSURLSessionDownloadDelegate 和 NSURLSessionDelegate 协议。
    
        2> 初始化:
    
            初始化 :- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration
            取消   :- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks;
    
        3> 任务:
    
            数据任务:dataTaskWithRequest:
    
            上传任务:
                   从文件上传   :uploadTaskWithRequest:fromFile:
                   从数据上传   :uploadTaskWithRequest:fromData:
                   从数据流上传 :uploadTaskWithStreamedRequest:
    
            下载任务:
                   使用指定的请求创建下载任务 :downloadTaskWithRequest:
                   使用续传数据创建下载任务   :downloadTaskWithResumeData:
    
            任务进度:
                   上传进度:- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask;
                   下载进度:- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask;
    
        4> 代理回调:
    
            <1> 会话代理回调:
    
                设置管理的会话无效回调方法:
    
                    - (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block;
    
                        block 参数:
                            session :会话
                            error   :导致会话无效相关的错误
    
                        设置当管理的会话无效时执行的 block。
    
                设置需要身份验证回调方法:
    
                    - (void)setSessionDidReceiveAuthenticationChallengeBlock:
                                                (NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session,
                                                                          NSURLAuthenticationChallenge *challenge, 
                                                                     NSURLCredential * __autoreleasing *credential))block;
    
                        block 参数:
                            session    :会话
                            challenge  :身份验证质询
                            credential :指向凭据的指针,该凭据用于解决身份验证
    
                        block 返回值:
                            返回身份验证的配置情况
    
                        设置当连接需要身份验证质询时执行的 block。
    
            <2> 任务代理回调:
    
                设置上传流回调方法:
    
                    - (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block;
    
                        block 返回值:
                            要上传文件的 NSInputStream。
    
                        设置一个请求体二进制流发送至远程服务器时执行的 block。
    
                设置重定向回调方法:
    
                    - (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, 
                                                                                   NSURLSessionTask *task, 
                                                                                      NSURLResponse *response, 
                                                                                       NSURLRequest *request))block;
    
                        block 参数:
                        session  :会话
                            task     :任务
                            response :重定向响应
                            request  :要重定向的请求
    
                        block 返回值:
                            返回导致重定向的请求 NSURLRequest
    
                        设置 HTTP 请求尝试重定向到其他 URL 时执行的 block。
    
                设置身份验证质询回调方法:
    
                    - (void)setTaskDidReceiveAuthenticationChallengeBlock:
                                             (NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, 
                                                                                   NSURLSessionTask *task, 
                                                                       NSURLAuthenticationChallenge *challenge, 
                                                                  NSURLCredential * __autoreleasing *credential))block;
    
                        block 参数:
                            session    :会话
                            task       :任务
                            challenge  :身份验证质询
                            credential :指向解决验证需要使用凭据的指针
    
                        block 返回值:
                            返回对身份验证请求质询的处置
    
                        设置接收到特定身份验证质询时执行的 block。
    
                设置上传进度回调方法:
    
                    - (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, 
                                                              NSURLSessionTask *task, 
                                                                       int64_t bytesSent, 
                                                                       int64_t totalBytesSent, 
                                                                       int64_t totalBytesExpectedToSend))block;
    
                        block 参数:
                            session                  :会话
                            task                     :任务
                            bytesSent                :本次上传字节数
                            totalBytesSent           :已经上传的字节数
                            totalBytesExpectedToSend :总字节数
    
                        设置跟踪上传进度要执行的 block。
    
                设置任务完成回调方法:
    
                    - (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block;
    
                        block 参数:
                            session :会话
                            task    :任务
                            error   :任务执行过程中出现的错误
    
                        设置特定任务完成后执行的 block。
    
            <3> 数据任务代理回调:
    
                设置接收到响应回调方法:
    
                    - (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, 
                                                                                            NSURLSessionDataTask *dataTask, 
                                                                                                   NSURLResponse *response))block;
    
                        block 参数:
                            session  :会话
                            dataTask :任务
                            response :接收到的响应
    
                        block 返回值:
                            返回对会话响应的处置
    
                        设置数据任务接收到响应时执行的 block。
    
                设置成为下载任务回调方法:
    
                    - (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, 
                                                                    NSURLSessionDataTask *dataTask, 
                                                                NSURLSessionDownloadTask *downloadTask))block;
    
                        block 参数:
                            session      :会话
                            dataTask     :任务
                            downloadTask :成为的下载任务
    
                        设置数据任务成为下载任务时执行的 block。
    
                设置接收到数据回调方法:
    
                    - (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block;
    
                        block 参数:
                            session  :会话
                            dataTask :任务
                            data     :接收的数据
    
                        设置数据任务接收到数据时执行的 block。
    
                设置缓存行为回调方法:
    
                    - (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, 
                                                                                 NSURLSessionDataTask *dataTask, 
                                                                                  NSCachedURLResponse *proposedResponse))block;
    
                        block 参数:
                            session          :会话
                            dataTask         :任务
                            proposedResponse :建议缓存的 URL 响应
    
                        block 返回值:
                            返回要缓存的响应
    
                        设置确定数据任务的缓存行为执行的 block。
    
                设置入队消息提交回调方法:
    
                    - (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block;
    
                        block 参数:
                            session:会话
    
                        设置会话的所有入队消息已经被提交时执行一次的 block。
    
            <4> 下载任务代理回调:
    
                设置下载完成回调方法:
    
                    - (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, 
                                                                     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值