|
|
|
//
|
|
|
|
// APRequestSerializer.m
|
|
|
|
// LekangGuard
|
|
|
|
//
|
|
|
|
// Created by ecell on 2022/10/10.
|
|
|
|
//
|
|
|
|
|
|
|
|
#import "APRequestSerializer.h"
|
|
|
|
#import "AFURLRequestSerialization.h"
|
|
|
|
|
|
|
|
@interface APQueryStringPair : NSObject
|
|
|
|
|
|
|
|
@property (readwrite, nonatomic, strong) id field;
|
|
|
|
@property (readwrite, nonatomic, strong) id value;
|
|
|
|
|
|
|
|
- (instancetype)initWithField:(id)field value:(id)value;
|
|
|
|
|
|
|
|
- (NSString *)URLEncodedStringValue;
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation APQueryStringPair
|
|
|
|
|
|
|
|
- (instancetype)initWithField:(id)field value:(id)value {
|
|
|
|
self = [super init];
|
|
|
|
if (!self) {
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
self.field = field;
|
|
|
|
self.value = value;
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *)URLEncodedStringValue {
|
|
|
|
if (!self.value || [self.value isEqual:[NSNull null]]) {
|
|
|
|
return self.field;
|
|
|
|
} else {
|
|
|
|
return [NSString stringWithFormat:@"%@%@", self.field,self.value];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation APRequestSerializer
|
|
|
|
|
|
|
|
FOUNDATION_EXPORT NSArray * APQueryStringPairsFromDictionary(NSDictionary *dictionary);
|
|
|
|
FOUNDATION_EXPORT NSArray * APQueryStringPairsFromKeyAndValue(NSString *key, id value);
|
|
|
|
|
|
|
|
NSString * APQueryStringFromParameters(NSDictionary *parameters) {
|
|
|
|
NSMutableArray *mutablePairs = [NSMutableArray array];
|
|
|
|
for (APQueryStringPair *pair in APQueryStringPairsFromDictionary(parameters)) {
|
|
|
|
[mutablePairs addObject:[pair URLEncodedStringValue]];
|
|
|
|
}
|
|
|
|
return [mutablePairs componentsJoinedByString:@""];
|
|
|
|
}
|
|
|
|
|
|
|
|
NSArray * APQueryStringPairsFromDictionary(NSDictionary *dictionary) {
|
|
|
|
return APQueryStringPairsFromKeyAndValue(nil, dictionary);
|
|
|
|
}
|
|
|
|
|
|
|
|
NSArray * APQueryStringPairsFromKeyAndValue(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:APQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ([value isKindOfClass:[NSArray class]]) {
|
|
|
|
NSArray *array = value;
|
|
|
|
for (id nestedValue in array) {
|
|
|
|
[mutableQueryStringComponents addObjectsFromArray:APQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
|
|
|
|
}
|
|
|
|
} else if ([value isKindOfClass:[NSSet class]]) {
|
|
|
|
NSSet *set = value;
|
|
|
|
for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
|
|
|
|
[mutableQueryStringComponents addObjectsFromArray:APQueryStringPairsFromKeyAndValue(key, obj)];
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
[mutableQueryStringComponents addObject:[[APQueryStringPair alloc] initWithField:key value:value]];
|
|
|
|
}
|
|
|
|
return mutableQueryStringComponents;
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|