来源:Yuzeyang

链接:http://zeeyang.com/2016/03/15/AFNetWorking-two/

AFHTTPSessionManager继承于AFURLSessionManager,提供了更方便的HTTP请求方法,包括了GET、POST、PUT、PATCH、DELETE这五种方式,并且AF鼓励我们在AFHTTPSessionManager再进行一次封装来满足我们自己的业务需求


在开始的地方,AF一直提醒到一个属性baseURL,这个变量你可以在进一步封装的时候,将baseURL写成你自己的HTTP请求原始地址,比如

+ (NSURL *)baseURL {

return [NSURL URLWithString:kBaseURLString];

}

在对baseURL进行拼接的时候,也需要注意一下几点,防止出现请求的URL出现问题

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];

[NSURL URLWithString:@"foo" relativeToURL:baseURL];                  // http://example.com/v1/foo

[NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];          // http://example.com/v1/foo?bar=baz

[NSURL URLWithString:@"/foo" relativeToURL:baseURL];                 // http://example.com/foo

[NSURL URLWithString:@"foo/" relativeToURL:baseURL];                 // http://example.com/v1/foo

[NSURL URLWithString:@"/foo/" relativeToURL:baseURL];                // http://example.com/foo/

[NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/

在初始化的方法里面,我们看到这个方法

- (instancetype)initWithBaseURL:(nullable NSURL *)url;

- (instancetype)initWithBaseURL:(nullable NSURL *)url

sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;

NS_DESIGNATED_INITIALIZER的作用是什么呢?

指定的构造器通过发送初始化消息到父类来保证object被完全初始化,指定构造器有以下几个规则:

1.指定构造器必须调用父类的指定构造器

2.任何一个便利构造器必须调用最终指向指定构造器的其他构造器

3.具有指定构造器的类必须实现父类的所有指定构造器

- (instancetype)init {

// 指向- [initWithBaseURL:]

return [self initWithBaseURL:nil];

}

- (instancetype)initWithBaseURL:(NSURL *)url {

// 指向- [initWithBaseURL:sessionConfiguration:]

return [self initWithBaseURL:url sessionConfiguration:nil];

}

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {

// 指向- [initWithBaseURL:sessionConfiguration:]

return [self initWithBaseURL:nil sessionConfiguration:configuration];

}

- (instancetype)initWithBaseURL:(NSURL *)url

sessionConfiguration:(NSURLSessionConfiguration *)configuration

{

// 调用父类的- [initWithSessionConfiguration:]

self = [super initWithSessionConfiguration:configuration];

if (!self) {

return nil;

}

// baseURL赋值,AFHTTPRequestSerializer和AFJSONResponseSerializer序列化

return self;

}

DEPRECATED_ATTRIBUTE这个相信大家见得比较多了,字面意思就是这个API不建议开发者再使用了,再使用时,会出现编译警告

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString

parameters:(nullable id)parameters

success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success

failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;


下面POST、GET、PUT、PATCH、DELETE方法传参基本都是大同小异

URLString表示请求的URL,parameters表示客户端请求内容的存储器,progress表示请求的进度,constructingBodyWithBlock里面只有一个formData用来拼接到HTTP的请求体,success表示请求成功后的block回调,failure表示请求失败的block回调

那么这几个请求有什么区别呢?

1、POST请求是向服务端发送数据的,用来更新资源信息,它可以改变数据的种类等资源

2、GET请求是向服务端发起请求数据,用来获取或查询资源信息

3、PUT请求和POST请求很像,都是发送数据的,但是PUT请求不能改变数据的种类等资源,它只能修改内容

4、DELETE请求就是用来删除某个资源的

5、PATCH请求和PUT请求一样,也是用来进行数据更新的,它是HTTP verb推荐用于更新的

在实际开发过程中,我们还是使用POST和GET请求是最多的


在请求实现的部分,都是调用了-[dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure]方法创建NSURLSessionDataTask对象

传参的内容基本都是和上一层方法一样,method指的就是请求的类型

- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method

URLString:(NSString *)URLString

parameters:(id)parameters

uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress

downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress

success:(void (^)(NSURLSessionDataTask *, id))success

failure:(void (^)(NSURLSessionDataTask *, NSError *))failure

{

NSError *serializationError = nil;

NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];

if (serializationError) {

if (failure) {

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wgnu"

dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{

failure(nil, serializationError);

});

#pragma clang diagnostic pop

}

return nil;

}

__block NSURLSessionDataTask *dataTask = nil;

dataTask = [self dataTaskWithRequest:request

uploadProgress:uploadProgress

downloadProgress:downloadProgress

completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {

// 失败成功处理

}];

return dataTask;

}

AFNetWorking源码详解(二)的更多相关文章

  1. iOS AFNetWorking源码详解(一)

    来源:Yuzeyang 链接:http://zeeyang.com/2016/02/21/AFNetWorking-one/ 首先来介绍下AFNetWorking,官方介绍如下: AFNetworki ...

  2. OkHttp3源码详解(二) 整体流程

    1.简单使用 同步: @Override public Response execute() throws IOException { synchronized (this) { if (execut ...

  3. vue 源码详解(二): 组件生命周期初始化、事件系统初始化

    vue 源码详解(二): 组件生命周期初始化.事件系统初始化 上一篇文章 生成 Vue 实例前的准备工作 讲解了实例化前的准备工作, 接下来我们继续看, 我们调用 new Vue() 的时候, 其内部 ...

  4. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  5. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  6. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  7. udhcp源码详解(五) 之DHCP包--options字段

    中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...

  8. Activiti架构分析及源码详解

    目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...

  9. 源码详解系列(六) ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

随机推荐

  1. 关于MATLAB中的tic toc的问题

    关于MATLAB中的tic toc的问题 其一) MATLAB实际单位时间计时函数的具体应用,在编写程序时,经常需要获知代码的执行实际时间,这就需要在程序中用到计时函数,matlab中提供了以下三种方 ...

  2. cisco上的RIP V2加上MD5认证配置测试成功

    R1: Router#show run Building configuration... Current configuration : bytes ! version 12.3 service t ...

  3. kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.

    今天在写kafka生产者生成数据的程序并运行时,报如下错误: log4j:WARN No appenders could be found for logger (kafka.utils.Verifi ...

  4. 使用ListView时遇到的问题

    这周练习ListView时遇到了一个问题,从数据库中查询出的数据绑定到LIstView上,长按某个item进行删除操作,每次点击item取得的id都不对,调了半天终于找到了原因,关键是自己对自定义的B ...

  5. tar 解压命令

    1.tar.gz文件的解压 tar zxvf  *.tar.gz 2.bz2属性的解压 tar jxvf  *.bz2

  6. gmail

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  7. Rank of Tetris HDU--1881

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. Leveraging the Power of Asynchrony in ASP.NET [转]

    Asynchronous programming has had a lot of attention in the last couple of years and there are two ke ...

  9. [NOIP2007]奖学金

      题目来源:http://www.luogu.org/problem/show?pid=1093# 2007年NOIP全国联赛普及组 [题目描述 Description] 某小学最近得到了一笔赞助, ...

  10. linux 命令拾遗

    man ascii 这个命令会打印出八进制.十六进制和十进制的ASCII码表. xxd xxd可以生成所给与文件的十六进制拷贝,也可以将编辑好的十六进制拷贝还原成二进制格式.它也可以将十六进制拷贝输出 ...