AFNetworking源码 - AFHTTPSessionManager

如何下载安装Qt各个版本?(2025-4-28更新) 本文将教您快速获取Qt各版本安装包!妈妈再也不用担心我找不到Qt安装包了! 阅读详情

1. 前言


上一篇中我们在iOS Example代码中提到了AFHTTPSessionManager中的一个函数:

  
  1. - (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
  2. parameters:(nullable id)parameters
  3. progress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
  4. success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
  5. failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

这个函数作用其实看函数名就明白了- 使用GET类型的Request来创建并运行一个NSURLSessionDataTask。

2. dataTaskWithHTTPMethod

具体我们看函数实现:

  
  1. NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"
  2. URLString:URLString
  3. parameters:parameters
  4. uploadProgress:nil
  5. downloadProgress:downloadProgress
  6. success:success
  7. failure:failure];
  8. [dataTask resume];
  9. return dataTask;
  • 使用dataTaskWithHTTPMethod方法创建了一个NSURLSessionDataTask
  • 调用NSURLSessionDataTask的resume来开启这个session task

    • 知识点:session task的几种状态的操作函数
      • suspend -- 可以让当前的任务暂停
      • resume ---- 方法不仅可以启动任务,还可以唤醒suspend状态的任务
      • cancel ----- 方法可以取消当前的任务,你也可以向处于suspend状态的任务发送cancel消息,任务如果被取消便不能再恢复到之前的状态.

  • 最后返回这个task

我们很自然想到了,所有的关键都在dataTaskWithHTTPMethod这个函数。我们先不慌看这个函数的具体实现,先穷尽到这个函数的所有调用。我们已经知道这个函数是创建一个NSURLSessionDataTask,而系统提供给我们创建NSURLSessionDataTask的方法,有两个:

  1. 1.–dataTaskWithRequest:
  2. 2.–dataTaskWithRequest:completionHandler:

好,那我们就沿着这个线索一直找下去,一直找到有这两个函数使用的地方。追踪溯源,还真找到了这样一条函数调用栈。

QQ20160116-0

上图可以看出GET、HEAD、POST、PUT、PATCH、DELETE这些方法实现的不同之处只在于调用dataTaskWithHTTPMethod:传递的method名称不同。另外在调用dataTaskWithRequest:时候,其实已经在上一级函数dataTaskWithHTTPMethod:中构建好了一个NSMutableURLRequest类型的request。所以我们主要研究dataTaskWithHTTPMethod:函数实现。

dataTaskWithHTTPMethod函数的实现主要分两部分,一部分是构建NSMutableURLRequest,另一部分是根据已构建好的Request来构建NSURLSessionDataTask。

2.1 构建NSMutableURLRequest

此处构建request分为两个部分:

  1. 1.先调用AFHTTPRequestSerializer的requestWithMethod函数构建request
  2. 2.处理request构建产生的错误 – serializationError
2.1.1 requestWithMethod构建request

先直接暴力列出requestWithMethod的函数声明(注:requestWithMethod是AFHTTPRequestSerializer的一个成员函数,并且AFHTTPRequestSerializer遵循AFURLRequestSerialization协议)

  
  1. /**
  2. 使用指定的HTTP method和URLString来构建一个NSMutableURLRequest对象实例
  3. 如果method是GET、HEAD、DELETE,那parameter将会被用来构建一个基于url编码的查询字符串(query url)
  4. ,并且这个字符串会直接加到request的url后面。对于其他的Method,比如POST/PUT,它们会根
  5. 据parameterEncoding属性进行编码,而后加到request的http body上。
  6. @param method request的HTTP methodt,比如 `GET`, `POST`, `PUT`, or `DELETE`. 该参数不能为空
  7. @param URLString 用来创建request的URL
  8. @param parameters 既可以对method为GET的request设置一个查询字符串(query string),也可以设置到request的HTTP body上
  9. @param error 构建request时发生的错误
  10. @return 一个NSMutableURLRequest的对象
  11. */
  12. - (NSMutableURLRequest *)requestWithMethod:(NSString *)method
  13. URLString:(NSString *)URLString
  14. parameters:(nullable id)parameters
  15. error:(NSError * _Nullable __autoreleasing *)error;

接着我们来看requestWithMethod的具体实现:

  • 第一步:进行url转化和参数化断言
  
  1. NSParameterAssert(method);
  2. NSParameterAssert(URLString);
  3. NSURL *url = [NSURL URLWithString:URLString];
  4. NSParameterAssert(url);

其中NSParameterAssert(method) <=> NSParameterAssert(method != nil),同理NSParameterAssert(URLString)和NSParameterAssert(url)也一样。这里NShipster给出了一个金科玉律:

方法或函数应当在代码最开始处使用 NSParameterAssert / NSCParameterAssert 来强制输入的值满足先验条件,这是一条金科玉律;其他情况下使用 NSAssert / NSCAssert。

  • 第二步:使用url构建并初始化NSMutableURLRequest,然后设置HTTPMethod
  
  1. NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
  2. mutableRequest.HTTPMethod = method;
  • 第三步:给NSMutableURLRequest自带的属性赋值

NSURLRequest/NSMutableURLRequest需要赋值的属性可以在AFHTTPRequestSerializerObservedKeyPaths()中找到,我们可以进去看一下:

  
  1. // 定义了一个static的方法,表示该方法只能在本文件中使用
  2. // 函数整体上使用了单例模式
  3. static NSArray * AFHTTPRequestSerializerObservedKeyPaths() {
  4. static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil;
  5. static dispatch_once_t onceToken;
  6. // 此处需要observer的keypath为allowsCellularAccess、cachePolicy、HTTPShouldHandleCookies
  7. // HTTPShouldUsePipelining、networkServiceType、timeoutInterval
  8. dispatch_once(&onceToken, ^{
  9. _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))];
  10. });
  11. return _AFHTTPRequestSerializerObservedKeyPaths;
  12. }

简单介绍下上面添加的keypath:

  
  1. /**
  2. 是否允许使用设备的蜂窝移动网络来创建request,默认为允许:
  3. */
  4. @property (nonatomic, assign) BOOL allowsCellularAccess;
  5. /**
  6. 创建的request所使用的缓存策略,默认使用`NSURLRequestUseProtocolCachePolicy`,该策略表示
  7. 如果缓存不存在,直接从服务端获取。如果缓存存在,会根据response中的Cache-Control字段判断
  8. 下一步操作,如: Cache-Control字段为must-revalidata, 则 询问服务端该数据是否有更新,无更新话
  9. 直接返回给用户缓存数据,若已更新,则请求服务端.
  10. */
  11. @property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy;
  12. /**
  13. 如果设置HTTPShouldHandleCookies为YES,就处理存储在NSHTTPCookieStore中的cookies
  14. HTTPShouldHandleCookies表示是否应该给request设置cookie并随request一起发送出去
  15. */
  16. @property (nonatomic, assign) BOOL HTTPShouldHandleCookies;
  17. /**
  18. HTTPShouldUsePipelining表示receiver(理解为iOS客户端)的下一个信息是否必须等到上一个请求回复才能发送。
  19. 如果为YES表示可以,NO表示必须等receiver收到先前的回复才能发送下个信息。
  20. */
  21. @property (nonatomic, assign) BOOL HTTPShouldUsePipelining;
  22. /**
  23. 设定request的network service类型. 默认是`NSURLNetworkServiceTypeDefault`.
  24. 这个network service是为了告诉系统网络层这个request使用的目的
  25. 比如NSURLNetworkServiceTypeVoIP表示的就这个request是用来请求网际协议通话技术(Voice over IP)。
  
  1. 系统能根据提供的信息来优化网络处理,从而优化电池寿命,网络性能等等
  2. */
  3. @property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType;
  4. /**
  5. 超时机制,默认60秒
  6. */
  7. @property (nonatomic, assign) NSTimeInterval timeoutInterval;

然后通过判断mutableObservedChangedKeyPaths(NSMutableSet)中是否有这个keyPath,来设定mutableRequest对应的keyPath值。

  
  1. for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
  2. if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {
  3. [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
  4. }
  5. }

至于mutableObservedChangedKeyPaths是什么,我们可以在AFURLRequestSerialization文件中的observeValueForKeyPath函数中得到答案。整个过程是这样的:

image

关键就是在哪里会产生keypath的值变化了的消息?

image

也就是说你只要使用了keyPath对应的的setter方法,就会响应observerValueForKeyPath这个方法,从而将对应的keyPath添加到了mutableObservedChangedKeyPaths。至于添加keyPath到observer中,那是在AFHTTPRequestSerializer的init中干的活:

image

  1. 第四步:将传入的parameters进行编码,并添加到request中

此过程主要集中在requestBySerializingRequest这个函数中。在介绍requestBySerializingRequest之前,先简单介绍下,为什么会有这个函数的存在?


引用自AFNetworking2.0源码解析<二> :

一般我们请求都会按key=value的方式带上各种参数,GET方法参数直接加在URL上,POST方法放在body上,NSURLRequest没有封装好这个参数的解析,只能我们自己拼好字符串。AFNetworking提供了接口,让参数可以是NSDictionary, NSArray, NSSet这些类型,再由内部解析成字符串后赋给NSURLRequest。

转化过程大致是这样的:

  
  1. @{
  2. @"name" : @"bang",
  3. @"phone": @{@"mobile": @"xx", @"home": @"xx"},
  4. @"families": @[@"father", @"mother"],
  5. @"nums": [NSSet setWithObjects:@"1", @"2", nil]
  6. }
  7. ->
  8. @[
  9. field: @"name", value: @"bang",
  10. field: @"phone[mobile]", value: @"xx",
  11. field: @"phone[home]", value: @"xx",
  12. field: @"families[]", value: @"father",
  13. field: @"families[]", value: @"mother",
  14. field: @"nums", value: @"1",
  15. field: @"nums", value: @"2",
  16. ]
  17. ->
  18. name=bang&phone[mobile]=xx&phone[home]=xx&families[]=father&families[]=mother&nums=1&num=2

或者看下面这段解释:

比如说我定义了下面这个parameter:

  
  1. NSString *URLString = @"http://example.com";
  2. NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};

使用GET方式,最后得到的request是这样的:

  
  1. [[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
  2. GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3

或者使用POST方式,最后得到的request是这样的:

  
  1. [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
  2. POST http://example.com/
  3. Content-Type: application/x-www-form-urlencoded
  4. foo=bar&baz[]=1&baz[]=2&baz[]=3

requestBySerializingRequest也分为三个部分:

  • requestBySerializingRequest函数 - 第一部分

设置request的http header field:

  
  1. [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
  2. if (![request valueForHTTPHeaderField:field]) {
  3. [mutableRequest setValue:value forHTTPHeaderField:field];
  4. }
  5. }];

这里关于http header field的值都存放在了HTTPRequestHeaders中了。至于HTTPRequestHeaders的设置,是在多个函数中都有设置的。此处就不一一赘述,后面遇到会详解。

  • requestBySerializingRequest函数 - 第二部分

根据parameter来构建查询字符串,这里一开始parameter如下:

  
  1. Printing description of parameters:
  2. {
  3. baz = (
  4. 1,
  5. 2,
  6. 3
  7. );
  8. foo = bar;
  9. }

经过构建后,得到query为(这个例子中的构建方式使用的是AFQueryStringFromParameters()函数):

  
  1. Printing description of query:
  2. baz[]=1&baz[]=2&baz[]=3&foo=bar

事实上代码中有两种构建query的方式:

其中一种就是,如果自定义了queryStringSerialization(AFQueryStringSerializationBlock的block变量)。那么就使用自定义的queryStringSerialization构建方式(此方法在AFNetworking的test中用的比较多)

还有一种就是上面的那个AFQueryStringFromParameters()函数,我们可以看到AFQueryStringFromParameters的调用结构是下图这样的:

image

讲解的话,我觉得根据上图从后往前讲比较好:

首先看NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value)这个函数

该函数首先定义了一个NSSortDescriptor *sortDescriptor:

  
  1. // 根据需要排列的对象的description来进行升序排列,并且selector使用的是compare:
  2. // 因为对象的description返回的是NSString,所以此处compare:使用的是NSString的compare函数
  3. // 即@[@"foo", @"bar", @"bae"] ----> @[@"bae", @"bar",@"foo"]
  4. NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)];

接着会对value的类型进行判断,有NSDictionary、NSArray、NSSet类型。不过有人就会问了,在AFQueryStringPairsFromDictionary中给AFQueryStringPairsFromKeyAndValue函数传入的value不是NSDictionary嘛?还要判断那么多类型干啥?对,问得很好,这就是AFQueryStringPairsFromKeyAndValue的核心----递归调用并解析,你不能保证NSDictionary的value中存放的是一个NSArray、NSSet。

既然是递归,那么就要有结束递归的情况,比如解析到最后,对应value是一个NSString,那么就得调用函数中最后的else语句:

  
  1. else {
  2. [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]];
  3. }

注意此处定义了一个AFQueryStringPair:

  
  1. @interface AFQueryStringPair : NSObject
  2. @property (readwrite, nonatomic, strong) id field;
  3. @property (readwrite, nonatomic, strong) id value;
  4. // ...
  5. @end

而initWithField做的就是将key赋给field,value赋值给value。大家可以回头看一下最开始举的那个例子,就产生了对应的field-value。

接着回到AFQueryStringPairsFromDictionary函数,好像没啥好说的。再回到AFQueryStringFromParameters函数,这个函数就是把这些构建好的AFQueryStringPair一个个用&连接好。这里注意一点就是,此处会对AFQueryStringPair使用其URLEncodedStringValue函数做一定的处理,其实就是Percent-encoding(百分号编码)。


知识点:百分号编码

根据RFC 3986,以下字符为保留字:

image

另外,在RFC 3989 – Section 3.4部分,“?”和“/”当作为URL中的query string的时候,不再当做保留字。

此处主要是通过stringByAddingPercentEncodingWithAllowedCharacters函数来给我们的string进行百分号编码的。其中stringByAddingPercentEncodingWithAllowedCharacters函数需要传入不需要百分号编码的字符集(也就是不包括上面说的保留字,即函数中构建的allowedCharacterSet)。另外,为了防止image字符造成的问题,此处还需要使用rangeOfComposedCharacterSequencesForRange函数来处理字符长度。

举个例子,如果我传入的字符串为image,那么最终得到的百分号编码的字符串为

poloby%3A%23mulberry%5B%5D%40%F0%9F%91%B4%F0%9F%8F%BB%F0%9F%91%AE%F0%9F%8F%BD

下图是保留字的百分号编码:

image


所以事实上,上面最终生成的query url中,[]都会被%5B%5D所代替。

  • requestBySerializingRequest函数 - 第三部分

最后判断该request中是否包含了GET、HEAD、DELETE(都包含在HTTPMethodsEncodingParametersInURI)。因为这几个method的quey是拼接到url后面的。而POST、PUT是把query拼接到http body中的。

如果method是GET、HEAD、DELETE等。最后将query合并到mutbleRequest的query url上。不过这里还是要分情况讨论,如果request的query url不为空,就在生成的query前拼接&字符,再拼接到原先的query url上,如果request的query url为空,就将生成的的query前拼接?字符,再拼接到request的url上

  
  1. Printing description of mutableRequest:
  2. <NSMutableURLRequest: 0x7f9a63f237c0> { URL: https://api.app.net/stream/0/posts/stream/global?baz%5B%5D=1&baz%5B%5D=2&baz%5B%5D=3&foo=bar }

如果method是POST、PUT等。最后将query设置到http body上。另外,在此之前,函数会判断request的Content-Type是否设置了,如果没有,就默认设置为application/x-www-form-urlencoded。

2.1.2 处理serializationError

生成request出错了怎么办?这里冒出了一个completionQueue,暂时不管它,因为我并不知道这个东西是怎么用的。一般的话,我们都是在main queue来执行自定义的failure函数处理error。

2.2 构建NSURLSessionDataTask

有了request后,就可以调用-[AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:]来构建session data task。

同样地,dataTaskWithRequest函数也分为两个部分。第一部分是创建一个dataTask,第二个部分是调用addDelegateForDataTask这个函数,具体这个函数是做什么的,目前我也不是很清楚。

2.2.1 创建dataTask

使用了url_session_manager_create_task_safely(dispatch_block_t block)这个函数。这个函数主要的目的是为了解决iOS8之前的一个bug,详见https://github.com/AFNetworking/AFNetworking/issues/2093。在这个issue中,提问者建议版本小于iOS8的使用QUEUE_SERIAL的dispatch。所以才有了url_session_manager_create_task_safely这个函数,注意函数名中的create task和safely。由于在iOS8之后,这个bug被修复了,所以直接调用block()即可。

  
  1. static void url_session_manager_create_task_safely(dispatch_block_t block) {
  2. if (NSFoundationVersionNumber < NSFoundationVersionNumber_With_Fixed_5871104061079552_bug) {
  3. // Fix of bug
  4. // Open Radar:http://openradar.appspot.com/radar?id=5871104061079552 (status: Fixed in iOS8)
  5. // Issue about:https://github.com/AFNetworking/AFNetworking/issues/2093
  6. dispatch_sync(url_session_manager_creation_queue(), block);
  7. } else {
  8. block();
  9. }
  10. }
2.2.2 addDelegateForDataTask

字面上理解的话,就是给data task添加了一个delegate,而这个delegate的类型为AFURLSessionManagerTaskDelegate。为什么要给task加一个delegate?

我们看看AFURLSessionManagerTaskDelegate的定义:

  
  1. @interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>

这里我比较疑惑,NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate这三个delegate应该NSURLSession的delegate,你这边出现了一个AFURLSessionManagerTaskDelegate也来实现这三个delegate是几个意思?我猜测这里是不是一种分离的代码的方式,就是说把NSURLSession的delegate的实现分离出来给AFURLSessionManagerTaskDelegate实现。但是搜索了一下AFURLSessionManager中的session属性的构建:

  
  1. self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

这里的delegate并不是使用了AFURLSessionManagerTaskDelegate的那个delegate,所以上述猜测错误。不过我还是找到了点蛛丝马迹:

AFURLSessionManager中session(NSURLSession)的delegate设置为了AFURLSessionManager的self,并且AFURLSessionManager确实也遵循了NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate这三个协议,也实现了其中的方法。关键是实现这些方法时用到了AFURLSessionManagerTaskDelegate的delegate中实现的方法。至于为什么要这么做,话说我也是刚看,所以还需要消化一下。

这一篇就到此为止,下面一篇会详细介绍实现的NSURLSession的delegate方法了。


转:http://www.cnblogs.com/polobymulberry/p/5131983.html

倍福EL5101模块连接编码器 1、 EL5101模块简介:EL5101为单通道增量型编码器计数模块,一共有EL5101-0000、EL5101-0010、EL5101-0011、EL5101-0090(尚未供货)四种型号,其中EL5101-0000比较常用,本例使用EL5101-0000连接增量型编码器 2、 硬件外观和接线 在这里插入图片描述 3、 指示灯说明 4、和编码器连接的案例 ...... 阅读详情

相关推荐

unity人物刚体移动_Unity3D实现2D人物移动-总结篇

背景最近研究Unity3d,2d寻路的实现。所以又一次涉及到了角色坐标位移的问题。系统的对于角色鼠标点击移动这个简单问题进行整理和总结。本来就是一个简单的几何问题,结果发现已经有两个小坑,顺便填上,这里做下总结。实现需求:通过鼠标点击,控制2d角色移动,就是点哪里,角色向移动到哪里问题分解:按照时间进行动画分解,鼠标输入(动画开始)、平移(动画进行)、移动结束(动画结束)前提:这里前面的文章基本解...

weixin_39610366的博客 1274

【深度学习3】ubuntu22.04从零开始搭建深度学习环境

ubuntu22.04从零开始搭建深度学习开发环境

weixin_43387635的博客 1万+

IOS AFN 通过body传递参数给服务器

IOS AFN 通过body传递参数给服务器 2017-07-10 20:19行走在砂砾中 此段代码适用于请求接口时传参为json格式,而非常见的dictionary。同时设置请求头的Content-Type: application/json;charset=UTF-8 先将AFN文件导入 或者pod //本人微信号 song4533欢迎加 我有个iOS技术交流群可以一块交流,互换学...

ximiaoweilai的博客 5313

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑

本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。

weixin_42638178的博客 390

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 460

ios [AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selector sent to i...

解决步骤: 1.打开finder->前往->按住option->选择资源库->Developer->xcode->DerivedData->项目文件夹->删除Build 2.cocoapods pod update 3.重新运行程序 转载于:https://www.cnblogs.com/YuFly-lyx/p/8032510.h...

banzhai6311的博客 811

树莓派4B:控制步进电机

文章目录准备阶段接线阶段树莓派程序 准备阶段 准备以下物品,淘宝都可以买到: 57步进电机 电源开关(220v转24v,3A,72W) 步进电机驱动器 电源线 电线 杜邦线 树莓派4B一套 具体型号如下: 接线阶段 整体:接线效果如下图 电源开关起220v转24v作用,很好接线,输出24v接入步进电机驱动器 步进电机驱动器的 A+ A- B+ B- 按提示接步进电机四线,步进电机上就会有说...

学习路上的鸭子的博客 1万+

AFNetworking解析(三)

本文回详细的介绍一下Multipart协议在AFN中的使用,以及在请求中和后台的交互,其中主要介绍挑战认证的处理Multipart协议Multipart协议是基于post方法的组合实现,和post协议的主要区别在于请求头和请求体的不同 multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需

此生长安的博客 6710

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三)

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三)

宁波阿成的博客 524

基于OSEK_TP.dll封装通用,多ECU自由切换的诊断函数库

本文介绍了基于CANoe内置OSEK_TP.dll库实现通用诊断通讯的方法。通过封装CAN_TP.cin顶层脚本,实现了ECU连接管理、数据收发和多ECU切换功能。系统采用字典结构存储ECU参数,支持从配置文件读取诊断ID等配置信息,通过TpCreateConnection建立TP层连接。文章详细说明了诊断请求发送函数Uds_DiagSendRequest的实现逻辑,以及如何利用回调函数处理收发事件。该方法无需依赖诊断数据库,通过底层封装实现了灵活高效的诊断通讯方案,适用于车载诊断领域的测试需求。

蚂蚁小兵 1565

AFNetworking 3.0+中使用body传数据

AFNetworking 3.0+中使用body传数据此篇是接着上一篇 iOS PBEwithMD5andDes加密解密算法,由于刚从AFNetworking2.0+升级到了3.0+,由AFHTTPRequestOperationManager改为AFHTTPSessionManager,还是照着以前的写法改一改网络请求工具类,然后把NSData数据加到body里面,发现服务器端死活收不到,被这个问

坚持自己! 1万+

《大数据: Hive 交互命令和常用配置》

一、Hive 交互命令 1. 首先解决一个可能发生的问题 (log4 jar包冲突) 我这里解决方法就是删除一个,我删的是hive下的包 yexiang@hadoop1:<hive>$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/soft/apache-hive-2.3.7-bin/lib/log4j-slf4j-impl-2.6.2.ja.

yexiang优快云的专栏 287

AFNetWorking源码之AFHTTPSessionManager

1 概述 AFHTTPSessionManager是AFURLSessionManager的子类。我们可以通过这个类做HTTP请求。其实整个AFHTTPSessionManager逻辑很简单,只是用HTTP的方式拼接了请求,并且调用父类的方式做处理。我会通过AFHTTPSessionManagerapi来讲一下POST上传数据的几种基本格...

weixin_34218579的博客 686

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

AFNetworking源码-AFURLSessionManger和AFHTTPSessionManager

本博客借鉴自大佬博客:大佬博客 了解了AFNetworking的基本框架和以GET网络请求为例的请求原理流程之后,我们来以板块的形式了解一下AFURLSessionManger和AFHTTPSessionManager这两个通信模块。 首先看下图: 我们知道AFURLSessionManager是AFHTTPSessionManager的父类,其中AFURLSessionManager内部还包含AFURLSessionManagerTaskDelegate和_AFURLSessionTaskSwizzli

m0_52192682的博客 598

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

iOS网络——AFNetworking AFHttpSessionManager源码解析

你要知道的NSURLSession都在这里转载请注明出处 http://www.jianshu.com本系列文章主要讲解iOS中网络请求类NSURLSession的使用方法进行详解,同时也会以此为扩展,讲解SDWebImage中图片下载功能的源码分析,讲解AFNetworking相关源码分析。本系列文章主要分为以下几篇进行讲解,读者可按需查阅。 iOS网络——NSURLSession详解及SDWeb

什么都不会的小菜鸟 1763

【AFNetWorking源码(二)AFURLSessionManger和AFHTTPSessionManager】

在该模块中主要的任务就是发起网络请求。分成AFURLSessionManger和 AFHTTPSessionManager两部分来做处理。AFURLSessionManger是AFHTTPSessionManager的父类,其中AFURLSessionManger内部还包含AFURLSessionManagerTaskDelegate和_AFURLSessionTaskSwizzling;

weixin_61639290的博客 1197

源码分析之AFNetworking ①AFURLSessionManager与AFHTTPSessionManager

首先查看afn的结构,如下:  可以看到AF分为如下5个功能模块: 网络通信模块(最核心)(AFURLSessionManager、AFHTTPSessionManager) 网络状态监听模块(Reachability) 网络通信安全策略模块(Security) 网络通信信息序列化/反序列化模块(Serialization) 对于iOS UIkit库的拓展(UIKit) 一、1.网络通信模块-AFURLSessionManager与AFHTTPSes

iOSbird的博客 1095

AFNetworking 3.0源码阅读 - AFHTTPSessionManager

该篇是AFNetworking中网络框架部分的最后一部分AFHTTPSessionManager。 AFHTTPSessionManager是AFURLSessionManager的子类,提供通过提供basesURL来构建HTTP请求的便捷方法。仍旧是先从.h文件来读起。 AFHTTPSessionManager.h 用来拼接请求URL的基URL。构建出来的url在文件中的注释有提到...

weixin_30719711的博客 166

源码阅读:AFNetworking(七)——AFHTTPSessionManager

该文章阅读的AFNetworking的版本为3.2.0。 AFHTTPSessionManager类是我们平常使用AFNetworking用的最多的一个类,这个类是AFURLSessionManager类的子类,它封装了HTTP请求的创建方法。所以通过前一篇文章对AFURLSessionManager的阅读,我们再看这个类就会容易很多。 1.接口文件 1.1.属性 /** 用于构造NSURL对象...

weixin_34037515的博客 317

AFNetWorking(3.0)源码分析(三)——AFHTTPSessionManager(1)

关于AFNetWorking的源码分析已经断更了2年有余,现在来填坑了~ AFURLSessionManager &amp;amp; AFHTTPSessionManager 在我们访问网站时,可以想象做是我们在与远方的服务器进行“会话(Session)”。我们通过规定好的协议(如HTTP),告诉服务器,我们需要查询(GET)什么,我们要提交(POST)什么,我们要修改(PUT)什么,我们要删除(DELE...

无忘无往 1723

AFNetWorking(3.0)源码分析(四)——AFHTTPSessionManager(2)

在上一篇博客中,我们分析了AFHTTPSessionManager,以及它是如何实现GET/HEAD/PATCH/DELETE相关接口的。 我们还剩下POST相关接口没有分析,在这篇博客里面,我们就来分析一下POST相关接口是如何实现的。 multipart/form-data请求 在继续理解POST接口之前,我们先来了解一下HTTP协议中和POST相关的multipart/form-data请求...

无忘无往 1187

AFNetworking 3.0 源码解读(六)之 AFHTTPSessionManager

AFHTTPSessionManager相对来说比较好理解,代码也比较短。但却是我们平时可能使用最多的类。 AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3.0 源码解读(二)之 AFSecurityPolicy AFNetworking 3.0 源码解读(三)之 AFURLReques

MinggeQingchun的博客 554

AFNetworking3.1.0源码分析(十四)AFHTTPSessionManager

AFHTTPSessionManager功能如下图所示:

tsunamier的博客 355

iOS开发——AFNetworking源码(一)

iOS开发——AFNetworking源码(一) 简介 我们在学习AFNetworking之前,就必须知道AFNetworking是什么,具体有什么作用? 首先,AFNetworking是一个功能非常强大的框架,主要是用于网络请求,把复杂的原生代码封装好,我们只需要简单的几步就可以完成网络请求。 代码组成 从上图可以看出AFNetworking中含有很多类,那么这些类与类之间有什么关系呢,具体关系如图所示: 我们来解读一下这个图,按照我的理解来说,显而易见的是AFURLSessionManager应该是主

weixin_51638861的博客 1953

AFNetworking 学习笔记

看了下 AFNetWorking 的源码 发现是在不同的类中 设置不同的 Content-Type 这个暂时解读下, 具体的还要系统的阅读下 AFHTTPRequestSerializer : NSObject [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-T...

Coder 263
上一篇: NSURLSession - NSURLSessionTask 和 delegate
下一篇: AFNetworking源码 - NSURLSessionDelegate
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值