AFN请求的一个坑


今天帮助朋友调试一个接口

http://180.76.248.109/YWZ/ywz2/sp_ywz2_back_interface?inParameter={"call_name":"sp_tab_user_login","data":{"type":"1","phone_no":"18983766960","passwd":"123456"}}


一看到这个接口很奇怪,因为通常登录请求一般使用post,上面的请求使用的get请求 而且参数是字典嵌套字典,在拼接参数的时候客户端需要做 几次字典转字符串的操作

一开始是很奇怪的 


AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];

     manager.requestSerializer = [AFHTTPRequestSerializer serializer];

     manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    // 设置超时时间

    [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];

    manager.requestSerializer.timeoutInterval = 10.f;

    [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];

    [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json", @"text/javascript",@"text/plain", nil];

    

    NSMutableDictionary *dict =[NSMutableDictionary dictionary];

    [dict setValue:@"sp_tab_user_login" forKey:@"call_name"];

    NSMutableDictionary *dataDict =[NSMutableDictionary dictionary];

    [dataDict setValue:@"1" forKey:@"type"];

    [dataDict setValue:@"18983766960" forKey:@"phone_no"];

    [dataDict setValue:@"123456" forKey:@"passwd"];

    //这里有可能dataDict要转成String

    [dict setValue:dataDict forKey:@"data"];

    

    NSLog(@"参数json字典 %@",dict);

    //转成NSData

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];

    //转成String

    NSString *jsonStr =[[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding ];

    

    NSLog(@"参数json字符串%@",jsonStr);

    NSString *baseUrl = @"http://180.76.248.109/YWZ/ywz2/sp_ywz2_back_interface";

    NSString *urlStr =[NSString stringWithFormat:@"%@?inParameter=%@",baseUrl,jsonStr];

    


    NSLog(@"请求的urlStr %@",urlStr);

    //执行get请求

    [manager GET:urlStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

//        NSLog(@"reponse===> %@",responseObject);

        NSJSONSerialization *json =[NSJSONSerialization JSONObjectWithData:(NSData *)responseObject options:0 error:nil];

        

        NSLog(@"json %@",json)

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"error %@",error);

    }];


请求发出去后总是失败  报错是这样的

2017-09-02 21:59:52.240921+0800 DDU[2859:741150] *** Assertion failure in -[AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:], /Users/danny/Desktop/DDUWorkingCopySep01/DDUAug17BackUp/SVNBackUpJune12backup/DDU/DDU/Class/Library/AFNetworking/AFNetworking/AFURLRequestSerialization.m:353


很绝望 然后我说我用苹果自己的NSURLSession试一下吧  然后结果是url格式不支持

Printing description of error:
Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo={NSLocalizedDescription=unsupported URL, NSUnderlyingError=0x600000649870 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}}


其实我大概想到是什么问题 应该是字符编码的问题 因为输出url放到浏览器是没问题的 而AFN的断言却告诉我这个url是nil,然后我谷歌了一下 发现 只是加了一行代码就完美解决了

 

   NSString *str1 = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

  我觉得应该是我们手动拼接的url 有可能是不是utf8的 二浏览器就比较智能

  NSString *str1 = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

Returns a new string made from the receiver by replacing all characters not in the specified set with percent encoded characters.

Entire URL strings cannot be percent-encoded, because each URL component specifies a different set of allowed characters. For example, the query component of a URL allows the “@” character, but that character must be percent encoded in the password component.

UTF-8 encoding is used to determine the correct percent encoded characters. Any characters in allowedCharacters outside of the 7-bit ASCII range are ignored.

返回一个新的字符串由接收方通过替换所有字符与编码字符百分比指定的设置。完整的URL字符串不能percent-encoded,因为每个URL组件允许指定一组不同的字符。例如,URL的查询组件允许“@”字符,但性格一定百分比编码的密码组件。utf - 8编码被用来确定正确的百分比编码字符。外的任何字符allowedCharacters 7位ASCII范围将被忽略。




到此为止  bug完美的修复了









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值