AFN是想必是很多人项目中的常客了,当然鄙人也用过很多次了,项目中传递的参数一般都是以字典类型进行传递的,比如登陆的用户名和密码,但是遇到一个Base64 加密的String 类型的数据传递后台,然而此时,NSString 作为参数传递进AFN发送POST 请求,然而..........然而没有调用网络请求方法,下面直接上代码描述具体解决方案
问题描述: 一个Base64 加密数据(NSString类型),作为参数调用AFN封装的网络请求,请求方法不调用,以下是控制器调用模型中网络请求方法
NSString *loginDataRsaBase64 = [RSAEncryptor encryptString:jsonStr publicKey:publicKeyString];
NSLog(@"jsonStr加密前>>%@", jsonStr);
NSLog(@"jsonStr加密后>>%@", loginDataRsaBase64);
NSLog(@"jsonStr解密后>>%@", [RSAEncryptor decryptString:loginDataRsaBase64 privateKey:privateKeyString]);
//点击登录按钮,post用户数据到后台
[HSLoginModel logInInfoWithSuccessBlock:^(NSArray *array){
if (array != nil)
{
/*跳转到主界面*/
NSLog(@"%@",array);
//登陆成功后,保存用户的用户名和密码
NSUserDefaults *account = [NSUserDefaults standardUserDefaults];
//保存NSString
[account setObject:self.userAccount.text forKey:@"userAccount"];
[account setObject:self.passWord.text forKey:@"passWord"];
}
} errorBlock:^(NSError *error) {
//
} requPara:loginDataRsaBase64];
网络请求方法
//发送异步请求,获取数据,字典转模型
+(void)logInInfoWithSuccessBlock:(void(^)(NSArray *array))successBlock errorBlock:(void(^)(NSError *error))errorBlock requPara:(NSString *)requestParameter
然而,当你传入的参数类型为NSString类型的时候,AFN并没有发送成功
原因分析
AFN框架对于参数是NSString类型没有做处理
解决方法
方法一: 网络工具修改方案
在你的网络封装的网络工具类里面,添加 setQueryStringSerializationWithBlock 的调用
//设置返回的格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
return parameters;
}];
方法二:AFN网络框架修改方案
AFURLRequestSerialization.m 中的requestBySerializingRequest方法中添加
if ([parameters isKindOfClass:[NSString class]])
{
[mutableRequest setHTTPBody:[parameters dataUsingEncoding:NSUTF8StringEncoding]];
}
方法三:自己写一个网络请求,不用AFN
NSURL *url = [NSURL URLWithString:@"请求的地址"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 指定请求方法:
request.HTTPMethod = @"POST";
// 实例化请求体字符串
NSString *body = loginDataRsaBase64;
// 将字符串转换成二进制数据
NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];
//设置请求体数据:
request.HTTPBody = data;
//发送异步网络请求.
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// NSURLResponse *response: 服务器响应
NSLog(@"%@",response);
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}];
就这样,完美解决,希望对大家有帮助!
网友评论