本文主要分析AFNetworking序列化NSMutableURLRequest
1:AFNetworking支持三种
media-type对应的http请求头字段Content-Type为:
①application/x-www-form-urlencoded
②
application/json
③
application/x-plist
在http请求中,请求方式为(GET,HEAD,DELEATE)都使用第①中第一种,因为这三种方式的请求参数是放在URI中,其它的(POST,PUT等)放在请求体中,对于AFNetworking默认也是支持第一种方式。
AFNetworking支持的三种方式支持的序列化请求对象和解析请求参数类有一下三个:
AFHTTPRequestSerializer
AFJSONRequestSerializer :AFHTTPRequestSerializer
AFPropertyListRequestSerializer :AFHTTPRequestSerializer
下面先说下对于
application/x-www-form-urlencoded
通用标准的解析请求参数的方式
解析原理:递归解析参数,直到出现参数中最终的结构为key :value(没有嵌套类型)时生成AFQueryStringPair对象,最终生成了所有key:value方式的AFQueryStringPair对象的数组
,然后对数组中的每个对象进行百分号编码,最终使用&拼接,生成最终的query字符串。示例:
①:{"key":[{"key":"value1"},{"key":"value2"},"key1"],"key2":"value3"} --->②:key[][key]=value1&key[][key]=value2&key[]=key1&key2=value3 --->③:key%5B%5D%5Bkey%5D=value1&key%5B%5D%5Bkey%5D=value2&key%5B%5D=key1&key2=value3
//①-->②
FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary);
FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value);
//②-->③
NSString * AFQueryStringFromParameters(NSDictionary *parameters)
以上三个类都遵循序列化协议:
@protocol AFURLRequestSerialization <NSObject, NSSecureCoding, NSCopying>
对原始请求对象进行copy(即序列化原始request,因为从NSURLRequest定义
@interface NSURLRequest : NSObject <NSSecureCoding, NSCopying, NSMutableCopying>
可以知道内部已经实现了序列化协议,可以直接使用mutableCopy来序列化)
@param request 原始请求对象
@param parameters 需要编码的请求参数
@param error 编码请求参数过程中出现的错误信息
@return 返回值为经过序列化之后的请求对象
- (nullable NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
withParameters:(nullable id)parameters
error:(NSError * _Nullable __autoreleasing *)error NS_SWIFT_NOTHROW;
AFHTTPRequestSerializer实现序列化请求对象的方式:
①:序列化原始请求对象:
//验证原始request是否为空,如果为空就输出错误日志信息,并结束程序
NSParameterAssert(request);
//深拷贝原始request对象,并设置新request对象的请求头参数
NSMutableURLRequest *mutableRequest = [request mutableCopy];
[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
if (![request valueForHTTPHeaderField:field]) {
[mutableRequest setValue:value forHTTPHeaderField:field];
②:解析并生成query string,此处可以实现自定义的解析方式,AFNetworking抛出的有接口 queryStringSerialization block对象,默认是按照上面的
application/x-www-form-urlencoded 方式:
NSString *query = nil;
if (parameters) {
if (self.queryStringSerialization) {//如果自己实现了对参数的解析,就调用自定义的参数解析
NSError *serializationError;
query = self.queryStringSerialization(request, parameters, &serializationError);
if (serializationError) {
if (error) {
*error = serializationError;
return nil;
} else {
//默认的解析方式有AFNetworking自己实现对参数的解析并生成query字符串
switch (self.queryStringSerializationStyle) {
case AFHTTPRequestQueryStringDefaultStyle:
query = AFQueryStringFromParameters(parameters);
break;
③:设置Content-Type 和处理URI,如果是老三样(GET,HEAD,DELETE)按照RFC的规范这几种请求方式的请求参数是放在url query部分,显式的呈现在URI中,并且是默认使用
application/x-www-form-urlencoded,如果是其它的(POST,PUT)则设置Content-Type为
application/x-www-form-urlencoded同时设置请求体参数。因此需要做如下的判断:
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
if (query && query.length > 0) {
mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]];
} else {
// #2864: an empty string is a valid x-www-form-urlencoded payload
if (!query) {
query = @"";
//其它方式的请求如(POST PUT )设置httpBody,默认设置Content-Type为form表单提交形式
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];
NSParameterAssert(request);
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
return [super requestBySerializingRequest:request withParameters:parameters error:error];
如果是(POST,PUT)方式先序列化原始请求对象并设置请求参数:
NSMutableURLRequest *mutableRequest = [request mutableCopy];
[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
if (![request valueForHTTPHeaderField:field]) {
[mutableRequest setValue:value forHTTPHeaderField:field];
②:设置Content-Type为
application/json
if (parameters) {
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
③:解析请求参数为jsondata并设置请求体参数:
if (![NSJSONSerialization isValidJSONObject:parameters]) {
if (error) {
NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"The `parameters` argument is not valid JSON.", @"AFNetworking", nil)};
*error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo];
return nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error];
if (!jsonData) {
return nil;
[mutableRequest setHTTPBody:jsonData];
NSParameterAssert(request);
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
return [super requestBySerializingRequest:request withParameters:parameters error:error];
如果是(POST,PUT)方式先序列化原始请求对象并设置请求参数:
NSMutableURLRequest *mutableRequest = [request mutableCopy];
[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
if (![request valueForHTTPHeaderField:field]) {
[mutableRequest setValue:value forHTTPHeaderField:field];
②:设置Content-Type为application/x-plist
if (parameters) {
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
[mutableRequest setValue:@"application/x-plist" forHTTPHeaderField:@"Content-Type"];
③:解析请求参数为jsondata并设置请求体参数:
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:parameters format:self.format options:self.writeOptions error:error];
if (!plistData) {
return nil;
[mutableRequest setHTTPBody:plistData];
本文主要分析AFNetworking序列化NSMutableURLRequest1:AFNetworking支持三种media-type对应的http请求头字段Content-Type为:①application/x-www-form-urlencoded ②application/json③application/x-plist 在http请求中,请求方式为(GET,HEAD
文章目录一、Promise的使用1. 基本语法Promise三种状态Promise链式调用1. 基本写法2. 使用静态方法3. 直接返回Promise.allPromise.race二、Axios使用1. 安装并引入2. 发送请求3. config配置4. 响应结构5. 并发请求6. 全局配置6. 创建实例7. 实例方法8. 拦截器请求拦截器响应拦截器9. Axios 封装三、使用 Axios 中遇到的一些问题总结1. 传递的参数是数组时的编码问题
一、Promise的使用
ES6 中一个非常重要和好用的特
通常我们在使用 Linux 系统的时候,一般不会直接使用 root 账户去登录,所以,有的时候执行命令时,会提示下面的错误:
Error: This script must be run as root!
其实解决方案很简单,下面简单介绍两种解决方案。
第一种是直接在要执行的命令...
AFNetworking 3.0 Code=-1016 错误解决方案
导入AFNetworking类库(请参考:iOS 9 导入类库全面详尽过程(Ruby安装->CocoaPods安装->导入类库))之后,然后小伙伴们就可以照着如下官方文档欢乐地写代码。
AFHTTPSessionManager *manager = ...
AFNetworking的作者Matt Thompson 提出了一个新的类似AFNetworking的网络基础库,并且专门使用最新的Swift语言写的,名为 Alamofire.
对于使用OC的开发者来说一定十分熟悉AFNetworking这个框架,因为现在我们的app只要是有关于网络访问的部分大部分都会通过这个框架来进行网络的访问。
而Alamofire 是 S
is not valid JSON: json: cannot unmarshal string into Go value of type map[string]interface
D:\Program Files\MongoDB\Server\4.0\bin>mongoexport.exe -h localhost:27001 -d mldn -c emps -q '{age:{$gt:20}}' -f name,age,job,salary --type=csv > emps1.csv
2018-09-10T10:49...
概况介绍:
这篇主要介绍AFNetworking中请求参数序列化的部分,具体代码在AFURLRequestSerialization中。AFURLRequestSerialization包含四部分:
AFHTTPRequestSerializaiton
AFJSONRequestSerializer
AFPropertyListRequestSerializer
AFHTTPRequestSe...
XMLBeans是Apache软件基金会下的一个开源项目,它提供了Java类来处理XML文档。XMLBeans可以将XML文档转化为Java对象,并且这些Java对象具有XML文档的结构和内容。XMLBeans提供一种简单而强大的方式来生成XML实例文档,从XML Schema推断类型,并将XML实例文档绑定到Java对象。
XMLBeans 3.1.0是XMLBeans的最新版本,它带来了多项新功能和改进。XMLBeans 3.1.0支持使用不同的XML Parser,使用户可以根据其需求选择XML Parser,而不是强制使用Apache Xerces。此外,XMLBeans 3.1.0现已支持Java 11,让Java 11用户能够充分发掘XMLBeans的功能。XMLBeans 3.1.0还提供了更好的性能和更好的可扩展性,让用户可以更轻松地扩展XMLBeans以满足其需求。
总之,XMLBeans 3.1.0是一款功能强大的XML处理工具,它提供了许多功能和改进,以便用户更轻松地处理XML文档,生成XML实例文档,并将XML绑定到Java对象,以满足各种应用程序的需求。