AFNetworking 参数(query,非body)包含数组
先看看需求,GET请求,ParameterType:query,orderStatus是一个数组
image.png
用afn 一般的GET请求 有数组时候 url 是这样
.../orders?...&orderStatus[]=1&orderStatus[]=2...
可是服务端那边获取不到orderStatus,且Android也没有问题,那就只能iOS端修改咯,问Android同事,他的链接是:
.../orders?...&orderStatus=1&orderStatus=2...
没有中括号的形式
解决:AFHTTPRequestSerializer中的方法
- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, id, NSError *__autoreleasing *))block
在block中返回需要的格式
复制了 afn 自带的query处理的方法
AFQueryStringFromParameters(parameters)
只改一句话
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
全部代码
@interface JMAFQueryStringPair : NSObject
@property (readwrite, nonatomic, strong) id field;
@property (readwrite, nonatomic, strong) id value;
- (instancetype)initWithField:(id)field value:(id)value;
- (NSString *)jm_URLEncodedStringValue;
@end
@implementation JMAFQueryStringPair
- (instancetype)initWithField:(id)field value:(id)value {
self = [super init];
if (!self) {
return nil;
}
self.field = field;
self.value = value;
return self;
}
- (NSString *)jm_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])];
}
}
@end
NSString * JM_AFQueryStringFromParameters(NSDictionary *parameters) {
NSMutableArray *mutablePairs = [NSMutableArray array];
for (JMAFQueryStringPair *pair in JM_AFQueryStringPairsFromDictionary(parameters)) {
[mutablePairs addObject:[pair jm_URLEncodedStringValue]];
}
return [mutablePairs componentsJoinedByString:@"&"];
}
NSArray * JM_AFQueryStringPairsFromDictionary(NSDictionary *dictionary) {
return JM_AFQueryStringPairsFromKeyAndValue(nil, dictionary);
}
NSArray * JM_AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)];
if ([value isKindOfClass:[NSDictionary class]]) {
NSDictionary *dictionary = value;
// Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries
for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
id nestedValue = dictionary[nestedKey];
if (nestedValue) {
[mutableQueryStringComponents addObjectsFromArray:JM_AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
}
}
} else if ([value isKindOfClass:[NSArray class]]) {
NSArray *array = value;
for (id nestedValue in array) {
// afn 原来代码
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
[mutableQueryStringComponents addObjectsFromArray:JM_AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@", key], nestedValue)];
}
} else if ([value isKindOfClass:[NSSet class]]) {
NSSet *set = value;
for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
[mutableQueryStringComponents addObjectsFromArray:JM_AFQueryStringPairsFromKeyAndValue(key, obj)];
}
} else {
[mutableQueryStringComponents addObject:[[JMAFQueryStringPair alloc] initWithField:key value:value]];
}
return mutableQueryStringComponents;
}
然后在AFHTTPSessionManager创建时候 添加代码
static AFHTTPSessionManager *httpManager = nil;
+ (AFHTTPSessionManager *)shareHttpManager {
if (!httpManager) {
httpManager = [AFHTTPSessionManager manager];
// ... 省略 ...
[httpManager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, id parameters, NSError *__autoreleasing *error) {
return JM_AFQueryStringFromParameters(parameters);
}];
// ... 省略 ...
}
return httpManager;
}
搞定