IOS AFNetworking的Post失敗及requestSerializer的正確使用
IOS AFNetworking的Post失敗及requestSerializer的正確使用
前言:
最近接手一個(gè)項(xiàng)目,因?yàn)橹暗捻?xiàng)目里面POST請(qǐng)求用的是ASI的,我就想著給替換成AFNetworking,但是在替換過(guò)程中遇到了一個(gè)大坑,解決了半天才發(fā)現(xiàn)是一個(gè)小問(wèn)題,下面將我的問(wèn)題給大家分享一下:
錯(cuò)誤描述和發(fā)現(xiàn)過(guò)程
Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set."
看了錯(cuò)誤描述后,根據(jù)它的描述是因?yàn)榉祷氐膉son數(shù)據(jù)格式不對(duì),不是json的,我就去修改AFNetworking的responseSerializer返回的序列化器,發(fā)現(xiàn)怎么改怎么不對(duì),各種嘗試無(wú)果之后,我打印了一下元數(shù)據(jù),發(fā)現(xiàn)返回的居然是Html格式的消息,消息內(nèi)容大概是服務(wù)器請(qǐng)求失敗了,好吧,搞了半天是我請(qǐng)求錯(cuò)誤了。我驗(yàn)證半天發(fā)現(xiàn)參數(shù)沒(méi)什么問(wèn)題啊,于是我就打印了一下用ASI請(qǐng)求body的數(shù)據(jù)發(fā)現(xiàn)是這樣子的:mid=10&method=userInfo&dateInt=20160818,我再打印了一下我用AFNetworking拼接成的body的數(shù)據(jù)格式居然是這樣子的{"mid":"11","method":"userInfo","dateInt":"20160818"},好吧,現(xiàn)在我知道是哪里有問(wèn)題了,因?yàn)橹皞鞯膮?shù)都是json格式的所以沒(méi)問(wèn)題,誰(shuí)知道這個(gè)服務(wù)器接受的數(shù)據(jù)不是json格式的,所以請(qǐng)求失敗了。那我就需要修改AFNetworking的requestSerializer了。
requestSerializer
關(guān)于 requestSerializer它就是AFNetworking參數(shù)編碼的序列化器,它一共有三種編碼格式:
- AFHTTPRequestSerializer:第一種是普通的http的編碼格式也就是mid=10&method=userInfo&dateInt=20160818,這種格式的。
- AFJSONRequestSerializer:第二種也是json編碼格式的,也就是編碼成{"mid":"11","method":"userInfo","dateInt":"20160818"}
- AFPropertyListRequestSerializer:第三種沒(méi)用過(guò),但是看介紹接編碼成pislt格式的參數(shù)
看了上面的介紹應(yīng)該能明白到底該如何修改了,下面貼上我的修改過(guò)程。
解決辦法
修改前:
_sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL]; //拼接參數(shù)的序列化器,使用的錯(cuò)誤的序列化器 _sharedCBClient.requestSerializer = [AFJSONRequestSerializer serializer]; //返回?cái)?shù)據(jù)的序列化器 _sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];
修改后:
_sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL]; //拼接參數(shù)的序列化器,使用的正確的序列化器 _sharedCBClient.requestSerializer = [AFHTTPRequestSerializer serializer]; //返回?cái)?shù)據(jù)的序列化器 _sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer]; _sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL]; //拼接參數(shù)的序列化器,使用的正確的序列化器 _sharedCBClient.requestSerializer = [AFHTTPRequestSerializer serializer]; //返回?cái)?shù)據(jù)的序列化器 _sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];
到這里我的問(wèn)題也就解決了,一個(gè)小小的問(wèn)題困擾了很久真是不應(yīng)該,以后應(yīng)該多跟后臺(tái)溝通溝通,要不出錯(cuò)了也不知道錯(cuò)在哪里,
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
iOS手勢(shì)識(shí)別的詳細(xì)使用方法(拖動(dòng),縮放,旋轉(zhuǎn),點(diǎn)擊,手勢(shì)依賴,自定義手勢(shì))
這篇文章主要介紹了iOS手勢(shì)識(shí)別的詳細(xì)使用方法(拖動(dòng),縮放,旋轉(zhuǎn),點(diǎn)擊,手勢(shì)依賴,自定義手勢(shì)),具有一定的參考價(jià)值,有需要的可以參考一下。2016-11-11iOS之UIWebView無(wú)法獲取web標(biāo)題的解決方法
這篇文章主要為大家詳細(xì)介紹了iOS之UIWebView無(wú)法獲取web標(biāo)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07簡(jiǎn)單談?wù)凜ore Animation 動(dòng)畫(huà)效果
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)凜ore Animation 動(dòng)畫(huà)效果。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06ios實(shí)現(xiàn)app強(qiáng)制更新功能
本篇文章主要介紹了ios實(shí)現(xiàn)app強(qiáng)制更新功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05