美文网首页
AFNetwork - Request模块解析

AFNetwork - Request模块解析

作者: 南城同學 | 来源:发表于2020-08-13 13:23 被阅读0次

主题:

网络请求模块(输入、输出)。

概要:

根据不同入参, 返回对应的数据格式request。

  • request中包含请求头配置 ,url , 参数(urlcode,json,xml, 文件上传表单)。
  • 位置:AFURLRequestSerialization.m

核心:

参数的处理。


1. 入口:
NSString *urlstr = @"https://www.xxx.com/api/xxx/user/profile/";
NSDictionary *param = @{@"versions_id":@"1", @"system_type":@"1"};
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURLSessionTask *task =  [manager POST:urlstr parameters:param progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
     NSLog(@"%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
     NSLog(@"%@", error);
}];
[task resume];
2. 在AFHTTPSessionManager中,有一个AFHTTPRequestSerializer属性:self.requestSerializer
// AFHTTPSessionManager.m  p262
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
}

它的初始化如下:

//AFHTTPSessionManager.m p82
self.requestSerializer = [AFHTTPRequestSerializer serializer]; 
  • 也就是说AFHTTPSessionManager默认处理的是urlcode表单格式;
3. 方法的内部实现;
// AFURLRequestSerialization.m p360
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                 URLString:(NSString *)URLString
                                parameters:(id)parameters
                                     error:(NSError *__autoreleasing *)error
{
    NSParameterAssert(method);
    NSParameterAssert(URLString);

    NSURL *url = [NSURL URLWithString:URLString];

    NSParameterAssert(url);

    NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
    mutableRequest.HTTPMethod = method;

   //1. 对请求头的配置,入口设置是没有配置请求头的,所以此处为空
    for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
        if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {
            [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
        }
    }
// 2. 转换参数
    mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy];

    return mutableRequest;
}
4. 此处 对请求头的配置,入口设置是没有配置请求头的,所以此处为空;
WeChat0cd9e7d5441e37b8f2e2a514e138db2a.png
5. 转换参数:把字典转换成urlcode表单格式;
mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy];
//AFURLRequestSerialization.m p478
- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                               withParameters:(id)parameters
                                        error:(NSError *__autoreleasing *)error
{
 >>>>
      switch (self.queryStringSerializationStyle) {
             case AFHTTPRequestQueryStringDefaultStyle:
                    //1. 将字典转换成表单格式
                     query = AFQueryStringFromParameters(parameters); // urlcode表单操作
                     break;
          }
>>>>
}

query = AFQueryStringFromParameters(parameters)这一步就是完成字典转表单功能.

6. 配置表单Content-Type.
//AFURLRequestSerialization.m p526
 if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
            [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        }
// urlcode 
[mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];

7. 以上为Request模块流程分析,默认配置为urlcode表单格式;
  • 使用Json格式请求设置如下:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer  = [AFJSONRequestSerializer serializer];

相关文章

  • AFNetwork - Request模块解析

    主题: 网络请求模块(输入、输出)。 概要: 根据不同入参, 返回对应的数据格式request。 request中...

  • AFNetwork - Response模块解析

    主题: 网络返回数据处理模块(输入、输出) 概要: 网络结束后的数据处理。 位置:AFURLResponseSer...

  • python爬虫7: urllib库使用

    基本介绍 内置库,不用下载。几个模块urllib.request 请求模块urllib.parse 解析模块,包...

  • AFNetWork后台返回字符串fail问题

    最近用AFNetWork3.0做了一个项目,发现原来AFNetWork已经默认是用的苹果的json解析了 结果后...

  • A'FNetwork返回转化

    虽然AFNetwork有返回解析,但是会不准,一般是自己来解析,加多这一句 [NSJSONSerializatio...

  • request 模块

  • request模块

  • scrapy框架流程简述

    文字描述 爬虫程序将start_urls,封装成request交给引擎模块。 引擎模块拿到request对象之后交...

  • shoucang

    今天我们来做个解析加收藏的功能 我们用在pods中导入target '项目名称' dopod 'AFNetwork...

  • 小尝 AFNnetworking

    网络解析:AFNnetworking详解 一、什么事AFN□在iOS开发中,使用比较广泛□全称是AFNetwork...

网友评论

      本文标题:AFNetwork - Request模块解析

      本文链接:https://www.haomeiwen.com/subject/glrbdktx.html