iOS 使用第三方網絡請求AFNetworking 以ContentType:application/x-www-form-urlencoded上傳表單時,格式為value=key&value=key&...
如果對上傳的數據沒有要求時,僅需要對 AFHTTPSessionManager初始化并設置contentType
AFHTTPSessionManager* mgr = [AFHTTPSessionManager manager];
mgr.requestSerializer = [AFHTTPRequestSerializer serializer];
[mgr.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
若對要上傳數據的格式有要求,例如某個字段排在拼接字符串的最后,這時如果僅僅把數據存入字典中再依次對元素進行拼接是做不到的,因為字典本身存儲數據的位置是沒有順序的,但顯示時,字典會對其進行ASCII排序,簡直可怕,無論對字典怎么操作結果都無法改變里面的順序。
于是改變想法,在AFNetworking對字典元素操作(取出元素進行拼接時),加以更改
所以,在AFURLRequestSerialization.m文件中 對
NSString * AFQueryStringFromParameters(NSDictionary *parameters)?
方法進行改動
NSString * AFQueryStringFromParameters(NSDictionary *parameters) {
NSMutableArray *mutablePairs = [NSMutableArray array];
NSString *encryString;
NSString *param = @"";
for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
if([[pair URLEncodedStringValue] rangeOfString:@"encry"].location !=NSNotFound)//_roaldSearchText
{
encryString = [pair URLEncodedStringValue];
continue;
}
[mutablePairs addObject:[pair URLEncodedStringValue]];
}
param = [mutablePairs componentsJoinedByString:@"&"];
if (param) {
param = [param stringByAppendingString:@"XX--這里是鹽--XX"];
const char *cStr = [param UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
param = output;
encryString = [NSString stringWithFormat:@"encry=%@",param];
}
if (encryString) {
[mutablePairs addObject:encryString];
}
NSString *endString = [mutablePairs componentsJoinedByString:@"&"];
return endString;
}
可以在其內操作時進行字符串拼接以及加密工作,這樣在調用請求方法時就可以和之前一樣傳入對應的請求參數,在這里進行拼接等一系列操作。