AFNetWorking妗嗘灦璇锋眰鍙傛暟GBK缂栫爜瑙g爜涓嶆敮鎸侀棶棰�

杩欎袱澶╅亣鍒颁竴涓棶棰樻槸锛屽綋鎴戠敤AFNetWorking杩涜POST璇锋眰锛屽苟涓擯OST鍙傛暟闇�瑕丟BK缂栫爜鏃讹紝璇锋眰浼氭湁闂銆�

璺熻釜浠g爜鍚庡彂鐜伴棶棰樺嚭鍦� AFPercentEscapedStringFromString 鍑芥暟閲�:

    NSString * AFPercentEscapedStringFromString(NSString *string) {
        static NSString * const kAFCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4
        static NSString * const kAFCharactersSubDelimitersToEncode = @"!$&'()*+,;=";

        NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
        [allowedCharacterSet removeCharactersInString:[kAFCharactersGeneralDelimitersToEncode stringByAppendingString:kAFCharactersSubDelimitersToEncode]];

        // FIXME: https://github.com/AFNetworking/AFNetworking/pull/3028
        // return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];

        static NSUInteger const batchSize = 50;

        NSUInteger index = 0;
        NSMutableString *escaped = @"".mutableCopy;

        while (index < string.length) {
            NSUInteger length = MIN(string.length - index, batchSize);
            NSRange range = NSMakeRange(index, length);

            // To avoid breaking up character sequences such as 馃懘馃徎馃懏馃徑
            range = [string rangeOfComposedCharacterSequencesForRange:range];

            NSString *substring = [string substringWithRange:range];
            NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];
            [escaped appendString:encoded];

            index += range.length;
        }

        return escaped;
    }

杩欎釜鍑芥暟鍏跺疄鏄仛URL缂栫爜鐨勶紝浣嗘槸鐢ㄧ殑 stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet 缂栧嚭鏉ラ兘鏄疷TF8 鏍煎紡鐨勶紝鏈夊績鐨勪綘浼氬彂鐜癆F涓嶆槸鍙互鑷畾涔夎姹傜紪鐮佹牸寮忕殑涔堬紝灏辨槸AFHTTPRequestSerializer 鐨� stringEncoding 灞炴�э紝杩欓噷绋嶅井鐞嗚В涓婣F璇锋眰鐨勫弬鏁拌浆鍙樻祦绋嬩负濡備笅锛�

  1. 浣犲彂閫佽姹傜殑鍏ュ弬 paramDic 瀛楀吀
  2. 浣犵殑鍏ュ弬paramDic浼氳瑙f瀽涓� key1=value1&key2=value2 鏍煎紡鐨勫瓧绗︿覆
  3. 琚В鏋愬ソ鐨� key1=value1&key2=value2 瀛楃涓茶杞崲涓篸ata鏍煎紡浼犲叆璇锋眰鐨� httpbody 閲�

鍦ㄨ繖涓繃绋嬩腑:

  • 1鍒�2鐨勮В鏋愯繃绋嬬敤鍒扮殑鏄笂闈㈣鐨勬湁闂鐨勬柟娉� AFPercentEscapedStringFromString锛屾墍浠ヤ换浣曡姹傝繖閮ㄩ兘鐢ㄧ殑UTF8缂栫爜
  • 鑰�2鍒�3鐨勬椂鍊欑殑缂栫爜绫诲瀷鎵嶇敤鍒�AFHTTPRequestSerializer 鐨� stringEncoding 灞炴��

鎵�浠ュ緢鏄庢樉锛屽鏋滀綘闇�瑕丟BK缂栫爜鏍煎紡缂栫爜璇锋眰鍙傛暟锛屽苟涓斾篃璁惧畾浜�AFHTTPRequestSerializer 鐨� stringEncoding涓篏BK 锛屽湪杩欎釜杩囩▼涓綘鐨勫弬鏁颁粠瀛楀吀鍙樹负鎷兼帴瀛楃涓茬殑鏃跺�欙紝浼氬厛杩涜UTF缂栫爜锛岀劧鍚庡瓧绗︿覆鍙堣浆鎴愪簡GBK鏍煎紡鐨刣ata绫诲瀷锛屽緢鏄剧劧涓嶅銆�

鎵�浠ユ渶缁堝鑷达紝濡傛灉浣犵殑POSTBody闇�瑕丟BK鎴栬�呭埆鐨勭紪鐮佹牸寮忕紪鐮侊紝褰撶敤AFNetworking鏃讹紝浼氱紪鐮侀敊璇紝瀵艰嚧浣犵殑鏈嶅姟鍣ㄨВ鐮佹槸涔熻В涓嶅锛屽鑷磋姹傚嚭闂銆�

杩欎釜闂鍐岮FNetworking鐨凣ithub瀹樻柟涓婚〉鐨刬ssue涓嬩篃鏈�璁板綍锛岀洰鍓嶈繕鏄痮pen鐘舵�侊紝鍗虫湭瑙e喅銆�


閭f�庝箞瑙e喅杩欎釜闂鍛紵

杩欐湁涓ょ瑙e喅鏂规硶锛屼竴绉嶄笉渚靛叆AF婧愮爜锛屼竴绉嶆槸鏀笰F婧愮爜銆�


1.閫氳繃AFHTTPRequestSerializer 鐨� setQueryStringSerializationWithBlock: 鏂规硶鑷畾涔�,閭d箞鏁翠釜璇锋眰娴佺▼浠g爜灏辩被浼煎涓嬶細
NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id  _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
    NSDictionary *dic = parameters;
    return [NSString stringWithFormat:@"%@=%@",[dic.allKeys[0] stringByAddingPercentEscapesUsingEncoding:gbkEncoding],[dic.allValues[0] stringByAddingPercentEscapesUsingEncoding:gbkEncoding]];

}];
manager.requestSerializer.stringEncoding = gbkEncoding;
[manager POST:searchHomeUrlStr parameters:@{@"key":@"GBK缂栫爜鍊�"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

}];

涓婇潰鎴戞槸涓句緥鍐欙紝浠g爜涓嶅緢涓ョ懢锛屼綘鑳芥槑鐧芥垜涓昏瑕佽〃杈句粈涔堟剰鎬濆氨琛屻��

姣忎釜闇�瑕� 闈濽TF8 鐨勮姹傞兘闇�瑕佸畾涔変笅 setQueryStringSerializationWithBlock: 鏂规硶锛屽湪杩欎釜鏂规硶涓綘闇�瑕佹妸浣犵殑鍙傛暟瀛楀吀瑙f瀽鎴� key1=value1&key2=value2 鏍煎紡锛屽苟涓旂敤浣犻渶瑕佺殑缂栫爜鏂瑰紡缂栫爜銆�

2.鐩存帴鏀规簮鐮�

鏀规簮鐮佽鏀�3澶勫湴鏂癸紝閮藉湪AFHTTPRequestSerializer閲岋紝绗�1澶勫拰绗�2澶勬柊澧炰袱涓柟娉曢渶瑕佽兘鎺ユ敹缂栫爜鏂瑰紡锛岀3澶勬敼鍔紝闇�瑕� requestBySerializingRequest: withParameters: error:鏂规硶閲屽垽鏂紪鐮佹柟寮忔槸涓嶆槸UTF8锛屽鏋滀笉鏄紝璧颁綘鏂板鐨勯偅涓や釜鏂规硶鏉ヨ揪鍒扮敤浣犺嚜宸辩紪鐮佹柟寮忕紪鐮併��

鏂板1锛氭棫AFQueryStringFromParametersWithEncoding涓嬫柊澧炰竴涓笅闈㈣繖涓嚱鏁帮紝澶氫竴涓紪鐮佹柟寮忓叆鍙�

NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding encode) {
    NSMutableArray *mutablePairs = [NSMutableArray array];
    for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
        [mutablePairs addObject:[pair URLEncodedStringValue:encode]];
    }

    return [mutablePairs componentsJoinedByString:@"&"];
}

鏂板2: 鏃�URLEncodedStringValue 鏂规硶涓嬫柊澧炰竴涓笅闈㈣繖涓柟娉曪紝涔熸槸澶氫竴涓紪鐮佹柟寮忓叆鍙�

- (NSString *)URLEncodedStringValue:(NSStringEncoding)encode {
        if (!self.value || [self.value isEqual:[NSNull null]]) {
            return AFPercentEscapedStringFromString([self.field description]);
        } else {
            if (encode == NSUTF8StringEncoding) {
                return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])];
            } else {
                
                return [NSString stringWithFormat:@"%@=%@", [self.field stringByAddingPercentEscapesUsingEncoding:encode], [self.value stringByAddingPercentEscapesUsingEncoding:encode]];
            }
        }
    }

鏀瑰姩3锛屼笅闈㈣繖涓柟娉曢噷锛屾敼鍔ㄥ湴鏂圭湅涓嬮潰浠g爜鍧椾笅闈㈢殑鍥撅細

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                                   withParameters:(id)parameters
                                            error:(NSError *__autoreleasing *)error
    {
        NSParameterAssert(request);

        NSMutableURLRequest *mutableRequest = [request mutableCopy];

        [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
            if (![request valueForHTTPHeaderField:field]) {
                [mutableRequest setValue:value forHTTPHeaderField:field];
            }
        }];

        NSString *query = nil;
        if (parameters) {
            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:
                        if (self.stringEncoding == NSUTF8StringEncoding) {
                            query = AFQueryStringFromParameters(parameters);
                        } else {
                            query = AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding);
                        }
                        
                        break;
                }
            }
        }

        if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
            if (query && query.length > 0) {
                mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]];
            }
        } else {
            // #2864: an empty string is a valid x-www-form-urlencoded payload
            if (!query) {
                query = @"";
            }
            if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
                [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
            }
            [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];
        }

        return mutableRequest;
    }

鏀瑰姩鍦版柟锛氳繖閲屽仛涓�涓槸鍚TF8鐨勫垽鏂紝涓嶆槸UTF8绫诲瀷璧颁綘鏂板1閲岀殑閭d釜鏂规硶锛屾妸缂栫爜鏂瑰紡浣滀负鍏ュ弬浼犲叆鍗冲彲锛�


AFNetWorking妗嗘灦璇锋眰鍙傛暟GBK缂栫爜瑙g爜涓嶆敮鎸侀棶棰�_第1张图片
image.png

鍋氫釜璁板綍锛屽鏋滄湁鏇村ソ鐨勬敼杩涙柟娉曪紝璇风暀瑷�銆傝阿璋€��

涓昏杩樻槸瑕佺瓑瀹樻柟淇繖涓猙ug鍟妦

你可能感兴趣的:(AFNetWorking妗嗘灦璇锋眰鍙傛暟GBK缂栫爜瑙g爜涓嶆敮鎸侀棶棰�)