来源: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. Android使用SAX解析xml

    一.理论准备     SAX采用事件驱动机制来解析XML文档,每当SAX解析器发现文档开始.元素开始.文本.元素结束.文档结束等事件时,就会向外发送一次事件,而开发者则可以通过编写事件监听器处理这些事 ...

  2. POJ 2750 Potted Flower(线段树的区间合并)

    点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...

  3. draw9patch超详细教程

    这篇文章是android开发人员的必备知识,内容摘选自网络,友我为大家整理和总结,不求完美,但是有用. 视频教程地址:http://player.youku.com/player.php/sid/XM ...

  4. Android软件开发之发送短信与系统短信库解析

    今天我和同学们讨论一下Android平台下如何调用系统方法发送短信.接收短信.系统的短信库相关的问题.进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信.在Eclipse下打开DDM ...

  5. swift 学习资源

    http://blog.csdn.net/sqc3375177/article/details/29206779

  6. php中header函数后是否应该有exit

    通常有一下三种:  代码如下 复制代码 Location: xxxx:yyyy/zzzz Content-Type: xxxx/yyyy Status: nnn xxxxxx 常用实例 1.实现重定向 ...

  7. Python之re模块

    参考:http://www.cnblogs.com/PythonHome/archive/2011/11/19/2255459.html 这个模块提供了与 Perl 相似l的正则表达式匹配操作.Uni ...

  8. 【HDOJ】5288 OO’s Sequence

    二分寻找对于指定pos的最左因数点和最右因数点. /* 5288 */ #include <iostream> #include <string> #include <m ...

  9. java学习多线程之卖票示例

    这一节我们来说一个示例就是卖票示例: 需求: 我们现在有100张票,然后分四个窗口来卖,直到卖完为止. 思路: 1.先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run ...

  10. mysql 限制并发select patch

    限制并发select的patch,代码量很少,主要是为了学习mysql的源码,yy一下. 增加两个全局控制变量: thread_limit_min thread_limit_max 增加一个条件变量: ...