AFNetworking的Post失敗,關於requestSerializer的正確使用

最近接手一個項目,由於以前的項目裏面POST請求用的是 ASI 的,我就想着給替換成AFNetworking,可是在替換過程當中遇到了一個大坑,解決了半天才發現是一個小問題,下面將個人問題給你們分享一下:json

錯誤描述和發現過程

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set."
看了錯誤描述後,根據它的描述是由於返回的 json 數據格式不對,不是 json 的,我就去修改AFNetworking的responseSerializer返回的序列化器,發現怎麼改怎麼不對,各類嘗試無果以後,我打印了一下元數據,發現返回的竟然是Html格式的消息,消息內容大概是服務器請求失敗了,好吧,搞了半天是我請求錯誤了。我驗證半天發現參數沒什麼問題啊,因而我就打印了一下用ASI請求body的數據發現是這樣子的:mid=10&method=userInfo&dateInt=20160818,我再打印了一下我用AFNetworking拼接成的body的數據格式竟然是這樣子的{"mid":"11","method":"userInfo","dateInt":"20160818"},好吧,如今我知道是哪裏有問題了,由於以前傳的參數都是json格式的因此沒問題,誰知道這個服務器接受的數據不是json格式的,因此請求失敗了。那我就須要修改AFNetworking的requestSerializer了。服務器

requestSerializer

關於 requestSerializer它就是AFNetworking參數編碼的序列化器,它一共有三種編碼格式:markdown

  • AFHTTPRequestSerializer:第一種是普通的http的編碼格式也就是mid=10&method=userInfo&dateInt=20160818,這種格式的。編碼

  • AFJSONRequestSerializer:第二種也是json編碼格式的,也就是編碼成{"mid":"11","method":"userInfo","dateInt":"20160818"}spa

  • AFPropertyListRequestSerializer:第三種沒用過,可是看介紹接編碼成pislt格式的參數code

看了上面的介紹應該能明白到底該如何修改了,下面貼上個人修改過程。blog

解決辦法

修改前:requests

1 _sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL];
2 //拼接參數的序列化器,使用的錯誤的序列化器
3  _sharedCBClient.requestSerializer = [AFJSONRequestSerializer serializer];
4  //返回數據的序列化器
5 _sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];

修改後:it

1 _sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL];
2 //拼接參數的序列化器,使用的正確的序列化器
3 _sharedCBClient.requestSerializer = [AFHTTPRequestSerializer serializer];
4 //返回數據的序列化器
5 _sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];
相關文章
相關標籤/搜索