AFHTTPRequestSerialization:

@方法1  

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method

URLString:(NSString *)URLString

parameters:(id)parameters

error:(NSError *__autoreleasing *)error  //设置请求方法,设置请求url,内部调用@方法2设置请求头和路径参数或者httpbody

@方法2

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request

withParameters:(id)parameters

error:(NSError *__autoreleasing *)error//设置请求头,根据paramters拼接请求路径或设置httpbody

@方法3

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method

URLString:(NSString *)URLString

parameters:(NSDictionary *)parameters

constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block

error:(NSError *__autoreleasing *)error//内部调用@方法1设置请求方法,设置请求url,设置请求头

调用AFStreamingMultipartFormData初始化@方法1,根据params组成AFQueryStringPair对象数组,遍历取出AFQueryPair的value和key,调用AFStreamingMultipartFormData 的@方法2拼接数据,调用block,在外部调用AFMultipartFormData协议方法,通过调用AFStreamingMultipartFormData的@方法2,拼接数据。最后调用AFStreamingMultipartFormData的@方法4,设置请求头content-type和

Content-Length以及httpbodystream

AFStreamingMultipartFormData

@方法1

- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest

stringEncoding:(NSStringEncoding)encoding//持有NSMutableRequest,设置字符编码,随机设置boundary,初始化

AFMultipartBodyStream对象

@方法2

- (void)appendPartWithFormData:(NSData *)data

name:(NSString *)name//设置字典headers,key为Content-Disposition,value为:[NSString stringWithFormat:@"form-data; name=\"%@\"", name],传递headers和data调用@方法3组装数据

@方法3

- (void)appendPartWithHeaders:(NSDictionary *)headers

body:(NSData *)body//设置一个AFHTTPBodyPart对象,赋值对象的header和body属性值,调用AFMultipartBodyStream@方法3将该对象添加到AFMultipartBodyStream的HTTPBodyParts数组中

@方法4

- (NSMutableURLRequest *)requestByFinalizingMultipartFormData//设置请求头content-type和Content-Length以及httpbodystream,

AFMultipartBodyStream

@方法1

- (instancetype)initWithStringEncoding:(NSStringEncoding)encoding//设置字符编码,初始化HTTPBodyParts数组

@方法2

- (NSInteger)read:(uint8_t *)buffer

maxLength:(NSUInteger)maxLength//调用AFHTTPBodyPart@方法1逐段读书数据到buffer中

@方法3

- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart//追加HTTPBodyPart对象到HTTPBodyParts数组

AFHTTPBodyPart

@方法1

- (NSInteger)read:(uint8_t *)buffer

maxLength:(NSUInteger)length//根据当前所处阶段值AFHTTPBodyPartReadPhase,获取该阶段的内容,如

AFEncapsulationBoundaryPhase&AFFinalBoundaryPhase就是boundary的内容,将内容转为data,调用@方法2取出data的字节赋值给buffer

AFHeaderPhase就是AFHTTPBodyPart的header值,将内容转为data,调用@方法2取出data的字节赋值给buffer

AFBodyPhase就是AFHTTPBodyPart的body值,body通过inputstream引用起来,通过NSInputStream流读取

@方法2

- (NSInteger)readData:(NSData *)data

intoBuffer:(uint8_t *)buffer

maxLength:(NSUInteger)length//取出data的字节赋值给buffer

@方法3

- (NSInputStream *)inputStream {//将body转为NSInputStream

if (!_inputStream) {

if ([self.body isKindOfClass:[NSData class]]) {

_inputStream = [NSInputStream inputStreamWithData:self.body];

} else if ([self.body isKindOfClass:[NSURL class]]) {

_inputStream = [NSInputStream inputStreamWithURL:self.body];

} else if ([self.body isKindOfClass:[NSInputStream class]]) {

_inputStream = self.body;

} else {

_inputStream = [NSInputStream inputStreamWithData:[NSData data]];

}

}

return _inputStream;

}

afn3.0源码解析---AFURLRequestSerialization的更多相关文章

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

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

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

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

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

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

  4. Android事件总线(二)EventBus3.0源码解析

    1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...

  5. solr&lucene3.6.0源码解析(二)

    上文描述了solr3.6.0怎么采用maven管理的方式在eclipse中搭建开发环境,在solr中,为了提高搜索性能,采用了缓存机制,这里描述的是LRU缓存,这里用到了 LinkedHashMap类 ...

  6. solr&lucene3.6.0源码解析(一)

      本文作为系列的第一篇,主要描述的是solr3.6.0开发环境的搭建   首先我们需要从官方网站下载solr的相关文件,下载地址为http://archive.apache.org/dist/luc ...

  7. apache mina2.0源码解析(一)

    apache mina是一个基于java nio的网络通信框架,为TCP UDP ARP等协议提供了一致的编程模型:其源码结构展示了优秀的设计案例,可以为我们的编程事业提供参考. 依照惯例,首先搭建a ...

  8. EventBus3.0源码解析

    本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充 ...

  9. Retrofit2.0源码解析

    欢迎访问我的个人博客 ,原文链接:http://wensibo.net/2017/09/05/retrofit/ ,未经允许不得转载! 今天是九月的第四天了,学校也正式开学,趁着大学最后一年的这大好时 ...

随机推荐

  1. es6 filter() 数组过滤方法总结

    1.创建一个数组,判断数组中是否存在某个值 var newarr = [ { num: , val: 'ceshi', flag: 'aa' }, { num: , val: 'ceshi2', fl ...

  2. vue+cordova插件使用,bluetoothSerial.connect()连接失败

    这是GitHub地址https://github.com/don/BluetoothSerial

  3. leetcode(js)算法10之正则表达式匹配

    mmp,对着答案看了三遍才看懂,真是菜的抠脚 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的 ...

  4. MySQL和B树的那些事

    一.零铺垫 在介绍B树之前,先来看另一棵神奇的树——二叉排序树(Binary Sort Tree),首先它是一棵树,“二叉”这个描述已经很明显了,就是树上的一根树枝开两个叉,于是递归下来就是二叉树了( ...

  5. vba 读取数据库

    1.安装数据库 2.创建数据源 Private Sub Worksheet_Change(ByVal Target As Range) Then Call mySQL End If End Sub P ...

  6. 远程连接你的linux服务器

    为什么要远程连接linux 在实际的工作场景中,虚拟机界面或者物理服务器本地的终端都是很少接触的,因为服务器装完系统之后,都要拉倒IDC机房托管,如果是购买的云主机,那更碰不到服务器本体了,只能通过远 ...

  7. 在Linux下用gcc编译hello world

    1. 确保Linux系统里已经装好了gcc 测试:输入gcc后是如下的结果就说明已经安装成功 2. 创建HelloWorld.c 使用 touch 创建一个空文件; 用vim编辑 按下A或者I 插入 ...

  8. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  9. ubuntu中如何安装python3.6

    此处使用命令行方式来安装Python3.6: sudo wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz sudo ta ...

  10. SPARK-18560

    ##### Receiver data can not be dataSerialized properly. ``` // :: ERROR executor.Executor: Exception ...