用過AFN的都知道,雖說上傳參數是id類型的,但是這個id類型只能是字典/數組/集合.... 但是一般對參數加密上傳的是NSString類型的啊......
屏幕快照 2016-08-11 11.47.58.png
怎么將你的NSDictionry/NSArry的參數加密后的字符串通過AFN 上傳呢?
兩種方法.
方法一:
只要在AFN里修改幾行代碼即可..
在AFURLRequestSerialization.m里
找到- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest )request withParameters:(id)parameters error:(NSError__autoreleasing *)error 這個方法
6148B827-9DD7-4E12-8F66-B91C7C704777.png
圖中紅色方框中的代碼是新加的...
被替換的是 [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
原理很簡單 就是NSMutableUrlRequest 設置請求提的時候,將原本只處理字典和數組的代碼 加上判斷去處理字符串. 這樣后臺就能收到你的加密字符串了...
//對字符串/數組/字典的加密 ----以上修改之后可直接上傳返回的字符串
- (NSString*)encodedSendingBody:(id)params{
NSString * dataStr;
if ([params isKindOfClass:[NSString class]]) {
dataStr = params;
}else{
NSError*error;
NSData * data = [NSJSONSerialization dataWithJSONObject:params
options:0
error:&error];
dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
//加密操作.
return requestBodyStr;
}
方法二:
構建請求參數.直接操作request
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
//requestManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
//[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
// 此處設置請求體 (即將參數加密后的字符串,轉為data)
一般是參數字典轉json字符串,再將json字符串加密,最后將加密后的字符串轉為data 設置為請求體
[request setHTTPBody: [data dataUsingEncoding:NSUTF8StringEncoding]];
發起請求:
requestManager = [AFHTTPSessionManager manager];
requestManager.requestSerializer = [AFJSONRequestSerializer serializer]; requestManager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSURLSessionDataTask * tesk = [requestManager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
failure(error);
}else{
success(responseObject);
}
}];
[tesk resume];