You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.2 KiB
92 lines
3.2 KiB
// |
|
// 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 |
|
|
|
|