这次主要开始讲解一下文件夹Serialization下的类AFURLRequestSerialization。

AFURLRequestSerialization类遵守`AFURLRequestSerialization`和`AFURLResponseSerialization`协议,提供一个查询字符串/表单编码的参数序列化和默认请求头的具体的基本的实现,以及响应状态代码和内容类型验证。也就是对发出的请求进行一些处理。

处理HTTP的任何请求或响应序列化被鼓励归入“AFHTTPRequestSerializer”的子类,以确保一致的缺省行为。

下面还是先看一下.h文件,看一下相关属性

第一个表示编码类型,字符串编码用于序列化的参数,默认值是UTF8

第二个bool类型表示是否创建请求可以使用设备的移动无线(如果阻止的话)。默认是YES,set方法是setAllowsCellularAccess

第三个表示缓存策略,创建请求的缓存策略,默认是NSURLRequestUseProtocolCachePolicy

第一个是否创建的请求应该使用默认的cookie处理,默认是YES

第二个是否创建的请求在接收一个来自一个更近的传输源的响应之前可以继续传输数据,默认是不可以NO

第三个为创建的请求的网络服务类型,默认是NSURLNetworkServiceTypeDefault

第四个为超时时间间隔,以秒为创建请求。默认超时时间间隔是60秒。

缺省HTTP报头字段值用于序列化的请求。默认情况下,这些包括以下:——“接收语言”带有NSLocale”+ preferredLanguages '的内容——“用户代理”带有各种包标识符和操作系统的名称的内容

下面看一下实现文件

AFPercentEscapedStringFromString方法将string里面的:#[]@!$&’()*+,;=字符替换成%

从可用字符替换删除掉:#[]@!$&’()*+,;=这些字符,声明批量处理的大小为50,循环将string里面的这些字符替换成%

往下看可以发现

AFQueryStringPair类里面有个- URLEncodedStringValue方法,

在这个方法里,将请求里面的URL参数转成field=value形式。

参数字典里面是我们查询的key和value,我们通过将字典内容转成AFQueryStringPair对象,调用- URLEncodedStringValue方法,转成key=value,放到mutablePairs数组里,最后用&符拼接起来。

如果是字典,遍历后返回key[nestedKey]=nestedValue;

如果是数组,遍历后返回key[nestedKey]=nestedValue;

如果是集合,遍历后返回key=obj;

如果是其他的,返回key=value.

根据上述分析

假设传入key和value,我将key,value放到数组里面,再放到mutableQueryStringComponents里

NSSet *afSet = [NSSet setWithObjects:@(1),@(2), nil];

NSDictionary *afDic = @{@"dickey": @{@"nestKey": @"nestValue"},

@"arrayKey": @[@[@(1)]],

@"setKey": afSet,

@"generalKey": @"generalValue"};

NSArray *resultArray = AFQueryStringPairsFromKeyAndValue(nil, afDic);

打印得到的结果是

[[arrayKey, 1],

[dickey[nestKey],nestValue],

[generalKey, generalValue],

[setKey, 1],

[setKey,2]]

接下来主要看一下AFHTTPRequestSerializer初始化方法,我们使用AFHTTPRequestSerializer对HTTP请求的头部进行处理

首先调用+ serializer进行初始化,里面调用了自己init方法

init里面先将Accept-Language存到mutableHTTPRequestHeaders里

将mainBundle里面根据使用语言的优先顺序放到acceptLanguagesComponents里面,再用","分隔,存到mutableHTTPRequestHeaders字典里面

然后拼接User-Agent,格式为”%@/%@ (%@; iOS %@; Scale/%0.2f)”,里面需要5个参数,第一个参数先获取项目名,如果没有,就用BundleIdentifier,第二个参数先获取短版本号,如果没有就用版本号,第三个参数是当前设备的类型,第四个参数是当前设备的版本号,第五个参数是屏幕的比例

然后设置属性的监听,这些属性在头文件里面都可以找到,实现文件里面也实现了set方法。在这里边调用了静态方法AFHTTPRequestSerializerObservedKeyPaths

下面实现了模式键值观察

通过KVO判断是否是新值,如果是的话,就加到mutableObservedChangedKeyPaths里面。

设置验证字段。

在初始化之后需要调用一下方法

根据url初始化,设置HTTP方法,根据mutableObservedChangedKeyPaths存储的属性,设置到mutableRequest当中,

调用- [requestBySerializingRequest:withParameters:error]方法,该方法如下

根据HTTPRequestHeaders来设置mutableRequest的头部字段。如果设置了queryStringSerialization这个block的话,就需要设置一个自定义的查询语句序列化方法,转成query查询参数。如果没有设置,则调用AFQueryStringFromParameters方法,转成query查询参数。将拼接好的query语句放到 mutableRequest.URL或者放到mutableRequest的HTTPBody里。

如有转载,请注明出处

参考文章:http://zeeyang.com/2016/05/25/AFNetWorking-five/

AFNetworking (3.1.0) 源码解析 <五>的更多相关文章

  1. AFNetworking (3.1.0) 源码解析 <三>

    今天要介绍的是Reachability文件夹下的AFNetworkReachabilityManager类.通过字面意思我们就可以知道AFNetworkReachabilityManager是用来监测 ...

  2. AFNetworking2.0源码解析<三>

    本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程 ...

  3. AFNetworking (3.1.0) 源码解析 <六>

    这次继续介绍文件夹Serialization下的类AFURLResponseSerialization.这次介绍就不拆分了,整体来看一下.h和.m文件. 协议AFURLResponseSerializ ...

  4. AFNetworking (3.1.0) 源码解析 <一>

    首先说一下AFNetworking的github地址:GitHub - AFNetworking/AFNetworking: A delightful networking framework for ...

  5. AFNetworking (3.1.0) 源码解析 <四>

    这次主要看一下文件夹Security中的类AFSecurityPolicy----安全策略类. AFSecurityPolicy主要的作用是验证HTTPS请求证书的有效性,在iOS9之后,默认不能发送 ...

  6. AFNetworking (3.1.0) 源码解析 <二>

    这次讲解AFHTTPSessionManager类,按照顺序还是先看.h文件,注释中写到AFHTTPSessionManager是AFURLSessionManager的子类,并且带有方便的HTTP请 ...

  7. solr&lucene3.6.0源码解析(三)

    solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...

  8. Heritrix 3.1.0 源码解析(三十七)

    今天有兴趣重新看了一下heritrix3.1.0系统里面的线程池源码,heritrix系统没有采用java的cocurrency包里面的并发框架,而是采用了线程组ThreadGroup类来实现线程池的 ...

  9. solr&lucene3.6.0源码解析(四)

    本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...

随机推荐

  1. 移动端屏幕自适应js与rem

    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;&qu ...

  2. asp.net用Zxing库实现条形码输出的具体实现

    首先要在项目中添加zxing.dll引用(zxing.dll下载地址http://www.jb51.net/dll/zxing.dll.html) 其次就是建立aspx文件,在后台中代码如下 复制代码 ...

  3. Windows上帝模式

    在桌面新建一个文件夹 按F2重命名为 GodMode.{ED7BA470-8E54-465E-825C-99712043E01C} 完成

  4. Sqlserver2005手动备份远程数据库到本地数据库方法

    1,在本地数据库中新建一个数据库名,如local 选中local,鼠标右键,任务,导入数据 2下一步: 注意:服务器名称写远程连接的主机的IP, 数据库选中你要备份的远程数据库. 3下一步: 注意:服 ...

  5. [C#] 用一种更优美的方式来替换掉又多又长的switch-case代码段

    switch-case语句是我们编码过程中常用的一种分支语句.然而正所谓成也萧何败萧何,每当我们向一个已经拥有了成百上千行的switch-case代码段中添加新的case分支的时候,我们是否有过为代码 ...

  6. nginx 伪静态大于10个参数 $10

    伪静态大于10个参数   会解析成 $1   与 0 参考:http://zhidao.baidu.com/link?url=kT2tp8ARhIZsrt4XF3LdzjkEq0QTIbvhOj9Ck ...

  7. Delphi-UpperCase 函数

    函数名称 UpperCase 所在单元 System.SysUtils 函数原型 function UpperCase(const S: string): string; 函数功能 将字符串中所有的小 ...

  8. MySQL 5.6.22 win32 zip版安装

    mysql 5.6.22 32位下载地址:http://cdn.mysql.com//archives/mysql-5.6/mysql-5.6.22-win32.zip 1 从http://dev.m ...

  9. Python3.4+opencv3

    1.安装Python 3.4 for Windows 好的这好像没有什么可以说的 2.下载OpenCV 3和Numpy(OpenCV依赖Numpy库) 大家在这里就出了问题.如果使用直接使用pip i ...

  10. Oracle归档日志定时删除任务

    1.在Oracle账号下,创建归档日志删除文件del_arch.sh 文件位置:/home/oracle/crontabOra,内容如下: #!/bin/bash LOG_DIR=/home/orac ...