ios AFNetworking 3.0 原码阅读分析 (一)(AFURLRequestSerialization)

  本文主要内容是讲AFNetworking中的AFURLRequestSerialization。它主要的作用是在我们要发送一个网络请求的时候帮助我们创NSMutableURLRequest并封装好所需要的参数到NSMutableURLRequest中。那它内部做了些什么,提供了什么功能,使得我们进行网络请求时候变得如此方便、简单。好像我们什么都不用管就能建立一个正确的请求体NSURLRequest。接下来就会一步步揭开它神秘的面纱。



  概览  

  首先看一下在AFURLRequestSerialization.h和AFURLRequestSerialization.m中所包含的类及它们间的关系,及各部分的功能。

AFURLRequestSerialization协议:定义了一个如下方法,各子类会根据自己需要有自己的实现

- (nullable NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                               withParameters:(nullable id)parameters
                                        error:(NSError * _Nullable __autoreleasing *)error

下面写个伪代码说明AFHTTPRequestSerializer、AFJSONRequestSerializer、AFPropertyListRequestSerializer功能(这个很重要!!!)。

    if (请求方式为:get || head || delete)
    {
        AFHTTPRequestSerializer、AFHTTPRequestSerializer、AFHTTPRequestSerializer     其实都调到了AFHTTPRequestSerializer的

            - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
        withParameters:(id)parameters
        error:(NSError *__autoreleasing *)error
        然后把parameters拼结成URL参数加到URL后面作为请求的一部分。
    }
    else if (表单提交)
    {
        AFHTTPRequestSerializer、AFHTTPRequestSerializer、AFHTTPRequestSerializer就会     都调用到AFHTTPRequestSerializer的

            - (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method
        URLString:(NSString *)URLString
        parameters:(nullable NSDictionary <NSString *, id> *)parameters
        constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
        error:(NSError * _Nullable __autoreleasing *)error;

        在这里面就会用到AFStreamingMultipartFormData,此时parameters及通过AFStreamingMultipartFormData添     加进来的数据都会变一项项的AFHTTPBodyPart存起来,当上传系统需要读数据时就通过AFHTTPBodyPart取数据。

    }
    else //即((put||post||patch) && !单提交时)
    {
        AFHTTPRequestSerializer:把parameters拼接成字符串后(如何拼接细节后面写)     序列化成NSData放到HTTPRequest的HTTPBody中。
        AFJSONRequestSerializer:把parameters以dataWithJSONObject方式序列化     成NSData放到HTTPRequest的HTTPBody中。
        AFPropertyListRequestSerializer:把请求parameters以dataWithPropertyList     方式序列化成NSData放到HTTPRequest的HTTPBody中。
    }

AFMultipartFormData协议:定义了一些接口方法,允许用户可以用不同的方式添加表单的内容,如:使用文件路径、直接用NSData、或使用inputStream等。

AFStreamingMultipartFormData:遵循了AFMultipartFormData协议,把协议的方法都实现了。

AFMultipartBodyStream:它起着一个重要桥梁作用,上传表单数据时系统会先调到它,然后它会依赖AFHTTPBodyPart读到数据,然后把数据返回给系统调用。

AFHTTPBodyPart:每一个AFHTTPBodyPart就是代表一项表单数据,由它真正读取它内部的数据(不管是以什么形式存在的:文件路径,NSData,又或者NSInputStream)。



 实现细节

  接下来(未完待续...)

时间: 2024-10-13 12:19:48

ios AFNetworking 3.0 原码阅读分析 (一)(AFURLRequestSerialization)的相关文章

AFNetworking 3.0源码阅读 - AFURLSessionManager

这次来说一下AFURLSessionManager 从头文件的英文注释可以看出AFURLSessionManager类创建并管理着NSURLSession对象,而NSURLSession又是基于NSURLSessionConfiguration的.同时该类也是AFHTTPSessionManager的父类,下一篇来讲. AFURLSessionManager实现了四个协议 1.NSURLSessionDelegate URLSession:didBecomeInvalidWithError: U

AFNetworking 3.0源码阅读 - AFURLRequestSerialization

AFURLRequestSerialization模块主要做的两样事情: 1.创建普通NSMUtableURLRequest请求对象2.创建multipart NSMutableURLRequest请求对象此外还有比如:处理查询的URL参数 也就是说这主要实现了请求报文构造器的功能 在AFURLRequestSerialization.h文件中声明了三个类来帮助开发者构造请求报文 1.AFHTTPRequestSerializer 2.AFJSONRequestSerializer 3.AFPr

AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization

本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3.0 源码解读(二)之 AFSecurityPolicy AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization 这次主要讲AFURLResponseSerialization(HTTP响应)这一个类的知识. 这是一个协议,只要遵守这个协议,就要实现N

EventBus 3.0 源码简要分析

EvenBus 可以在不同模块间传递信息,减少接口的使用. 一.使用例子 <span style="font-size:18px;">public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.la

muduo2.0源码阅读记录

花了20天的时间读了陈硕先生的<Linux多线程服务端编程>一书的前8章.当然,每天阅读的时间并不算多,中间有些部分也反反复复看了几遍,最后也算是能勉强接受作者传授的知识.配合书把muduo2.0网络部分的代码和日志库代码细读了一遍,这也算是个人第一次较为深入地去读取一个开源项目源码.通过书和源码的阅读,确实是对不少东西加深了理解. 本来想按自己的理解来写源码阅读笔记的,但考虑到网上关于muduo代码的解析文章已经很多并且写的很好了,就放弃了这个想法.摘录几个自己在源码阅读过程中参考的网页:

HashMap源码阅读分析(JDK1.8)

HashMap是JDK提供的经典容器之一,最近刚好时间充裕,于是自己看了一遍hashMap的源码实现,不同版本的JDK,HashMap的实现方式有所不同,本文主要针对JDK1.8的源码进行分析,至于各版本实现方式的不同,本文不做讨论,下面直接开始. 一.hash函数分析 map的put方法,首先调用的就是hash函数,返回key的hash值,其函数方法如下: static final int hash(Object key) { int h; return (key == null) ? 0 :

Vue2.0源码阅读笔记--生命周期

一.Vue2.0的生命周期 Vue2.0的整个生命周期有八个:分别是 1.beforeCreate,2.created,3.beforeMount,4.mounted,5.beforeUpdate,6.updated,7.beforeDestroy,8.destroyed. 用官方的一张图就可以清晰的了解整个生命周期: Vue最新源码下载:地址 二:源码分析 1.先看new Vue实例的方法 创建Vue实例的文件是: src/core/instance/index.js function Vue

seajs 3.0.0 源码阅读笔记

写笔记的时候才注意到我看的源代码是 3.0.0 的,但是官方发布的最新版本是 2.3.0.相信大部分是相同的,所以先把这个记完,再看一次 2.3.0 的代码. seajs 的源代码可以在 github上获取.seajs 在文档"如何参与开发"中说明了阅读顺序,当然为了便于阅读,在了解了目录结构之后,我直接阅读了合并好的 sea-debug.js. 整个seajs采用的是2空格缩进,避免分号的写法,我不是很习惯,但不影响阅读. 文件/目录结构 文档中各个源文件所包含的内容大致如下: in

AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一读这个框架的代码,我们的目标就是理解了它的思想之后,能够明白我们的请求是如何实现的,我们的代码哪里还需要进行改进,如果能够更进一步,我们能够总结出一套适合大部分应用的网络架构思想. 能够让一些人从中受益. 我们先来看看整个框架的文件系统,我们先不对每个文件的作用进行说明,在整个源码解读最后的一篇中我