美文网首页
AFNetworking--参数为NSString类型请求问题解

AFNetworking--参数为NSString类型请求问题解

作者: MrHC | 来源:发表于2017-11-14 22:57 被阅读163次

    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);
    
        
    }];
    

    就这样,完美解决,希望对大家有帮助!

    相关文章

      网友评论

          本文标题:AFNetworking--参数为NSString类型请求问题解

          本文链接:https://www.haomeiwen.com/subject/ardqvxtx.html