用过AFN的都知道,虽说上传参数是id类型的,但是这个id类型只能是字典/数组/集合.... 但是一般对参数加密上传的是NSString类型的啊......
怎么将你的NSDictionry/NSArry的参数加密后的字符串通过AFN 上传呢?
两种方法.
方法一:
只要在AFN里修改几行代码即可..
在AFURLRequestSerialization.m里
找到- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest )request withParameters:(id)parameters error:(NSError__autoreleasing *)error 这个方法
图中红色方框中的代码是新加的...
被替换的是 [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];