ios中使用AF請求帶json串的url

先展示需要請求的鏈接是什么樣子

 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:@""];

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

本人才疏學淺,如有寫的不對的地方,請提出。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容