美文网首页
ios中使用AF请求带json串的url

ios中使用AF请求带json串的url

作者: 一只努力的猿 | 来源:发表于2018-06-12 11:42 被阅读0次

先展示需要请求的链接是什么样子

 http://192.168.1.172:8110/pictureBookRecord/addPictureBookRecord?usertoken=1234567&userid= app11234234&jsonStr={\"id\": 1,\"userid\": \"22159185hj00115\",\"pageList\": [{\"pageNumber\":
 1,\"description\": \" 第 一 页 \",\"bookMaterial\": {\"type\": 1,\"linkAddress\": \"http:
 //aaa.mp3\"}}}]}

像这样的数据,见过的人应该不多吧。刚拿到接口文档的时候,也是一脸懵,正常的不应该是这样

http://192.168.1.172:8110/pictureBookRecord/addPictureBookRecord?usertoken=1234567&userid= app11234234

{\"id\": 1,\"userid\": \"22159185hj00115\",\"pageList\": [{\"pageNumber\":
 1,\"description\": \" 第 一 页 \",\"bookMaterial\": {\"type\": 1,\"linkAddress\": \"http:
 //aaa.mp3\"}}}]}

被突然多的“jsonStr”这个字段搞的不知道怎么弄。第一时间想到去百度,可惜没有百度到。
想让后台改成上面的那种的使用方法,后台说安卓的可以请求成功!
顿时,心中一万头***狂奔而过。没办法,项目比较急,还是的硬着头皮去研究。


自己想到了几个思路
1)直接请求肯定是不行的,那我可不可以将URL拼接好了再进行编码,最后再去请求呢?

NSString * str = MobilRegist;
NSDictionary * dic = [[NSDictionary alloc] initWithObjectsAndKeys:self.model.userName,@"accountName",self.model.userPwd,@"accountPwd",self.model.phone,@"mobilePhone",@"0",@"type",code,@"code", nil];
NSString * paramStr = [self dictionaryToJson:dic];
str = [str stringByAppendingString:[NSString stringWithFormat:@"data=%@",paramStr]];
str = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

事实证明对于字典不是很多个key-Value的有效,如果字典比较大的话,会出现数据内容过长的错误。


屏幕快照 2018-06-12 上午10.48.25.png

从抓包抓到的数据发现发现414的错误,所以这个方法不行。那我们换其它的方法吧!

2)可以直接放在post的parameter的参数中直接请求?

http://192.168.1.172:8110/pictureBookRecord/addPictureBookRecord?usertoken=1234567&userid= app11234234

jsonStr={\"id\": 1,\"userid\": \"22159185hj00115\",\"pageList\": [{\"pageNumber\":
 1,\"description\": \" 第 一 页 \",\"bookMaterial\": {\"type\": 1,\"linkAddress\": \"http:
 //aaa.mp3\"}}}]}

果不其然,和预料的一样,也是发生了错误


屏幕快照 2018-06-12 上午10.57.03.png

大概意思说的是,parameter需要一个json的参数。

3)就在自己没有办法的时候,安卓兄弟那边是可以进行正常的请求的。那好吧,那我就将安卓的请求是数据抓包,看一下是什么样子的。然后对比一下看看。

屏幕快照 2018-06-12 上午11.15.24.png
惊喜的发现他们也是使用post请求的,里面有一个name="jsonStr"的字段,而且上传的参数也是全部都有,而且大家不知道有没有看见Content-Disposition:form-data怎么感觉似成相识的感觉。我的天啊,这个不就是和上传头像的方法一毛一样吗?不就是在回调的方法中去上传需要上传的数据吗?好了,有了思路,开始添加方法。

4)开始修改

 AFHTTPSessionManager * mn = [self sharedHTTPSession];
 mn.responseSerializer = [AFHTTPResponseSerializer serializer];
 mn.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",nil];
        //https sslcertification
        [mn POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            
            NSData * data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];            
           [formData appendPartWithFileData:data name:@"jsonStr" fileName: @"json" mimeType:@"application/json"];     
        
        }progress:^(NSProgress *uploadProgress){
            
        }success:^(NSURLSessionDataTask *task, id responseObject) {
            
            if(success){
                success(responseObject);
            }
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            if(failure){
                failure(error.description);
            }
  }];

检查一遍,嗯!应该是没有问题的,一跑,我去!什么情况,居然,不行!
那再抓包和安卓的数据对比一下吧!

屏幕快照 2018-06-12 上午11.27.01.png
对比发现多了一个Content-Type:application/Json的参数,问了后台,后台说他们是收到数据了,但是解析不到数据。最后发现是数据类型不对。
那好吧,再修改吧。

5)既然多了这么一个参数,那我换其它的方法吧!

[formData appendPartWithFileData:data name:@"jsonStr" fileName: @"json" mimeType:@"application/json"];

换成

[formData appendPartWithFormData:data name:@"jsonStr"];

好,跑一下!哈哈!终于可以了。


最后补充一下将字典转换为字符串的方法。

NSData * data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString * jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *temp = [jsonStr stringByReplacingOccurrencesOfString:@" " withString:@""];
temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];

主要是去除特殊格式的字符串。

本人才疏学浅,如有写的不对的地方,请提出。

相关文章

网友评论

      本文标题:ios中使用AF请求带json串的url

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