afn3.0源码解析---AFURLRequestSerialization
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的更多相关文章
- solr&lucene3.6.0源码解析(四)
本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...
- solr&lucene3.6.0源码解析(三)
solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...
- Heritrix 3.1.0 源码解析(三十七)
今天有兴趣重新看了一下heritrix3.1.0系统里面的线程池源码,heritrix系统没有采用java的cocurrency包里面的并发框架,而是采用了线程组ThreadGroup类来实现线程池的 ...
- Android事件总线(二)EventBus3.0源码解析
1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...
- solr&lucene3.6.0源码解析(二)
上文描述了solr3.6.0怎么采用maven管理的方式在eclipse中搭建开发环境,在solr中,为了提高搜索性能,采用了缓存机制,这里描述的是LRU缓存,这里用到了 LinkedHashMap类 ...
- solr&lucene3.6.0源码解析(一)
本文作为系列的第一篇,主要描述的是solr3.6.0开发环境的搭建 首先我们需要从官方网站下载solr的相关文件,下载地址为http://archive.apache.org/dist/luc ...
- apache mina2.0源码解析(一)
apache mina是一个基于java nio的网络通信框架,为TCP UDP ARP等协议提供了一致的编程模型:其源码结构展示了优秀的设计案例,可以为我们的编程事业提供参考. 依照惯例,首先搭建a ...
- EventBus3.0源码解析
本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充 ...
- Retrofit2.0源码解析
欢迎访问我的个人博客 ,原文链接:http://wensibo.net/2017/09/05/retrofit/ ,未经允许不得转载! 今天是九月的第四天了,学校也正式开学,趁着大学最后一年的这大好时 ...
随机推荐
- 五种ip proxy的设置方法
我们在制作爬虫爬取想要的资料时,由于是计算机自动抓取,强度大.速度快,通常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网页,就很可能被封,在这里介绍相关的技巧,以免被封:但在制作爬虫时,还 ...
- matplotlib学习笔记
1.简介 matplotlib是python的一个2D绘图库,它可以在不同平台上地使用多种通用的绘图格式(hardcopy formats)和交互环境绘制出出版物质量级别的图片.matplotlib可 ...
- Centos查看系统CPU个数、核心数、线程数
1.查看 CPU 物理个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l 2.查看 CPU 核心数量 grep 'core id' /proc/ ...
- js 在echarts多条折线图数字*100 诡异出现小数
formatter:function(params){ //数据单位格式化 ].name; //x轴名称 , l = params.length; i < l; i++) { if(params ...
- Class--2019-04-14
获取class对象,有三种方法: 1.通过类名.class直接访问 Class c = Integer.class; 2.通过Class.forName(类名)函数获取 Class c = Class ...
- PTA L2-001 紧急救援 (带权最短路)
<题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- SQL Server Report Server 报表用户权限T-SQL查询
/************************************************************************** 查询用户在报表上的权限 ************ ...
- 大数据集群ssh登录其他机器失败 RSA host key for zb03 has changed and you have requested strict checking. Host key verification failed.
[hadoop@zb02 .ssh]$ scp authorized_keys hadoop@zb03:/home/hadoop/.ssh @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- vim编辑器操作命令
vim [参数] [文件 ..] 编辑指定的文件 或: vim [参数] - 从标准输入(stdin)读取文本 或: vim [参数] -t ...
- php实现根据字符串生成对应数组的方法
先看看如下示例: <?php $config = array( 'project|page|index' => 'content', 'project|page|nav' => ar ...