杩欎袱澶╅亣鍒颁竴涓棶棰樻槸锛屽綋鎴戠敤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璇锋眰鐨勫弬鏁拌浆鍙樻祦绋嬩负濡備笅锛�
- 浣犲彂閫佽姹傜殑鍏ュ弬 paramDic 瀛楀吀
- 浣犵殑鍏ュ弬paramDic浼氳瑙f瀽涓� key1=value1&key2=value2 鏍煎紡鐨勫瓧绗︿覆
- 琚В鏋愬ソ鐨� 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釜鏂规硶锛屾妸缂栫爜鏂瑰紡浣滀负鍏ュ弬浼犲叆鍗冲彲锛�
鍋氫釜璁板綍锛屽鏋滄湁鏇村ソ鐨勬敼杩涙柟娉曪紝璇风暀瑷�銆傝阿璋€��
涓昏杩樻槸瑕佺瓑瀹樻柟淇繖涓猙ug鍟妦