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. 1、Filebeat概述

    Filebeat是一个轻量级的日志托运工具,用于转发和集中日志数据. Filebeat作为代理安装在服务器上,监控指定的日志文件或目录,收集日志事件,并将它们转发到Elasticsearch或Logs ...

  2. jQuery 第六章 jQuery在Ajax应用

    1.本章目标 ajax 2.ajax 异步刷新技术,我们的网页不需要全部刷新,按需实现局部刷新,上线后台的交互 用户体验好 地图,前台验证,表单提交,修改,查询等等 原生的js和ajax packag ...

  3. table切换jquery插件 jQuery插件写法模板 流程

    通过$.extend()来扩展jQuery 通过$.fn 向jQuery添加新的方法 通过$.widget()应用jQuery UI的部件工厂方式创建 通过$.extend()来扩展jQuery $. ...

  4. 末学者笔记--Linux计划任务及压缩归档

    一.计划任务 1.介绍: (1)定义:简单说就是通过一些设置,来使linux系统定时执行一些操作与任务. (2)作用:一般可执行一些周期性操作,也可定期备份数据. (3)可使用的命令:常用为at和cr ...

  5. php判断浏览器还是微信打开

    本人亲测,但是存在一个小问题,就是用此方法在手机端打开会显示Google Chrome,但是在PC端是没有问题的,现在还在测试,先把第一版代码分享给大家! if(strpos($_SERVER['HT ...

  6. 学习笔记: yield迭代器

    yield 与 IEnumerable<T> 结对出现, 可实现按需获取 , 迭代器模式 static void Main(string[] args)         {         ...

  7. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  8. Python学习(四十一)—— Djago进阶

    一.分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views ...

  9. pycharm中split的应用

    #input 字符串 “5+9” value = "5+9" v1,v2 = value.split("+")#意思是把加号前后的5和9分别赋值给v1,v2 v ...

  10. 002.RHCS-配置Ceph存储集群

    一 前期准备 [kiosk@foundation0 ~]$ ssh ceph@serverc #登录Ceph集群节点 [ceph@serverc ~]$ ceph health #确保集群状态正常 H ...