AFNetworking 參數(shù)(query,非body)包含數(shù)組

先看看需求,GET請(qǐng)求,ParameterType:query,orderStatus是一個(gè)數(shù)組


image.png

用afn 一般的GET請(qǐng)求 有數(shù)組時(shí)候 url 是這樣

.../orders?...&orderStatus[]=1&orderStatus[]=2...

可是服務(wù)端那邊獲取不到orderStatus,且Android也沒(méi)有問(wèn)題,那就只能iOS端修改咯,問(wèn)Android同事,他的鏈接是:

.../orders?...&orderStatus=1&orderStatus=2...

沒(méi)有中括號(hào)的形式

解決:AFHTTPRequestSerializer中的方法

- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, id, NSError *__autoreleasing *))block

在block中返回需要的格式

復(fù)制了 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 原來(lái)代碼
            [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創(chuàng)建時(shí)候 添加代碼

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;
}

搞定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,680評(píng)論 1 32
  • AFN什么是AFN全稱是AFNetworking,是對(duì)NSURLConnection、NSURLSession的一...
    醉葉惜秋閱讀 1,347評(píng)論 0 0
  • 1、登錄(文本輸入、按鈕交互、基于網(wǎng)絡(luò)的交互) 2、刷新界面:(表視圖) 1>小部分應(yīng)用程序數(shù)據(jù)來(lái)源于本地 2>更...
    炙冰閱讀 903評(píng)論 0 1
  • 我們先看一下AFNetworking.h文件都給了我們什么方法 #import <Foundation/Found...
    瀟巖閱讀 774評(píng)論 0 1
  • 1.線性布局(LinearLayout) 按照垂直或者水平方向布局組件,其中的控件可以通過(guò)weight屬性來(lái)平分剩...
    dawsonenjoy閱讀 192評(píng)論 0 0

友情鏈接更多精彩內(nèi)容