通常网络请求使用AFNetworking我们都会将字典作为参数传给服务端,如果应用对数据的安全级别要求较高,这时肯定会将参数加密后再传输,那么上传的参数就变成一串看不懂的字符串,我们只需要设置AFHTTPSessionManager
中几个类型即可直接上传字符。
配置参数请求和接收类型
+ (AFHTTPSessionManager *)getRequstManager {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 30;
manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Content-Type"];
return manager;
}
配置完成后发送请求,可能会发现服务端接收的字符串前面莫名的多出'='符号,查看源码发现AFURLRequestSerialization
文件中下面的方法引起的
- (NSString *)URLEncodedStringValue {
if (!self.value || [self.value isEqual:[NSNull null]]) {
return AFPercentEscapedStringFromString([self.field description]);
} else {
return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])];
}
}
顺藤摸瓜发现AFQueryStringFromParameters
函数中使用到了- URLEncodedStringValue
方法。发现如下代码使用到了AFQueryStringFromParameters
函数,如果实现self.queryStringSerialization
属性就可以解决'='问题。
if (self.queryStringSerialization) {
NSError *serializationError;
query = self.queryStringSerialization(request, parameters, &serializationError);
if (serializationError) {
if (error) {
*error = serializationError;
}
return nil;
}
} else {
switch (self.queryStringSerializationStyle) {
case AFHTTPRequestQueryStringDefaultStyle:
query = AFQueryStringFromParameters(parameters);
break;
}
}
解决'='方法
AFHTTPSessionManager *manager = [self sessionManager];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return paramsStr;
}];
[manager POST:urlStr parameters:paramsStr progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
总结
- 不建议修改直接源码达到去掉'='目的,通常可能因为源码版本更新而遗忘。
- 如果使用原生网络请求可以直接通过
[request setHTTPBody:data]
来实现字符串或其他数据传输。