AFN请求的一个坑

来源:互联网 发布:悟空 知乎 编辑:程序博客网 时间:2024/06/01 21:07


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

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 = [[AFHTTPSessionManageralloc] init];

     manager.requestSerializer = [AFHTTPRequestSerializerserializer];

     manager.responseSerializer = [AFHTTPResponseSerializerserializer];

    // 设置超时时间

    [manager.requestSerializerwillChangeValueForKey:@"timeoutInterval"];

    manager.requestSerializer.timeoutInterval =10.f;

    [manager.requestSerializerdidChangeValueForKey:@"timeoutInterval"];

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

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

    

    NSMutableDictionary *dict =[NSMutableDictionarydictionary];

    [dictsetValue:@"sp_tab_user_login"forKey:@"call_name"];

    NSMutableDictionary *dataDict =[NSMutableDictionarydictionary];

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

    [dataDictsetValue:@"18983766960"forKey:@"phone_no"];

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

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

    [dict setValue:dataDictforKey:@"data"];

    

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

    //转成NSData

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

    //转成String

    NSString *jsonStr =[[NSStringalloc]initWithData:jsonDataencoding:NSUTF8StringEncoding ];

    

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

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

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

    


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

    //执行get请求

    [manager GET:urlStrparameters:nilprogress:nilsuccess:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

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

       NSJSONSerialization *json =[NSJSONSerializationJSONObjectWithData:(NSData *)responseObjectoptions:0error: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 = [urlStrstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLQueryAllowedCharacterSet]];

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

  NSString *str1 = [urlStrstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLQueryAllowedCharacterSet]];

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完美的修复了









原创粉丝点击