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/ ,未经允许不得转载! 今天是九月的第四天了,学校也正式开学,趁着大学最后一年的这大好时 ...
随机推荐
- linear-gradient 纯CSS3项目价格表切换代码
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8&qu ...
- java 利用jsoup 爬取知乎首页问题
今天学了下java的爬虫,首先要下载jsoup的包,然后导入,导入过程:首先右击工程:Build Path ->configure Build Path,再点击Add External JARS ...
- php 文件系统函数及目录函数
1.basename ,dirname ,pathinfo和realpath basename(path) 返回路径中的文件名部份,包含扩展名,path表示路径: dirname(path) 返回路径 ...
- python实现简单的登录管理
import json,timeusername=[]userpasswd=[]def login_success_file(name): try: f=open(r"F:/login_su ...
- maven build pulgin
<build> <defaultGoal>compile</defaultGoal> <plugins> <!-- 生成清单文件相关 --> ...
- MVC4 发布到II7或者IIS7.5遇到NO Find问题
1.出现的错误页面
- Spark SQL大数据处理并写入Elasticsearch
SparkSQL(Spark用于处理结构化数据的模块) 通过SparkSQL导入的数据可以来自MySQL数据库.Json数据.Csv数据等,通过load这些数据可以对其做一系列计算 下面通过程序代码来 ...
- Hibernate 映射一对一关联关系
基于外键的方式: 附上代码: public class Manager { private Integer mgrId; private String mgrName; private Departm ...
- Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:
异常引发的问题: 线程模型 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,⽐如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需 ...
- MariaDB基本操作--(创建用户)(转)
一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...