1. 程式人生 > >Alamofire 網路請求報錯 Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed

Alamofire 網路請求報錯 Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed

FAILURE: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0.” UserInfo={NSDebugDescription=Invalid value around character 0.}))

2018年5月24補充:Invalid value around character 0 這個錯誤代表傳入的第一個引數有誤,要麼引數拼錯了,要麼跟後臺的要求對不上號。這次遇見的問題是header裡的第一個欄位"Content-type"對應的引數不對,修改後調通了。

第一次用Alamofire寫Swift專案,寫好的網路請求報瞭如上的錯誤,看意思是說JSON序列化失敗,在服務端查看了一下請求日誌,沒發現什麼問題。於是就把目光轉移到網路引數上,請求程式碼如下:

Alamofire.request(urlString, method: .get, parameters: param, encoding: URLEncoding.default, headers: configHeaders()).responseJSON { (response) in
            print("\(response)")
            //response是我們自定義的,這個變數用於接收伺服器響應的資訊
            //使用switch判斷請求是否成功,也就是response的result
            switch response.result {
            case .success( _):
                //當響應成功時,使用臨時變數value接收伺服器返回的資訊並判斷是否為[String: AnyObject]型別,如果是那麼將其傳給定義方法中的success
                if let value = response.result.value as? [String: AnyObject] {
                    success(value)
                }
            case .failure(let error):
                failture(error)
                print("error:\(error)")
            }
        }

其中,設定請求頭函式如下:
//FIXME:配置header,可以自定義
    func configHeaders() -> HTTPHeaders {
        
        var headers:HTTPHeaders = ["Content-type":"application/json;charset=utf-8",
                                   "Accept":"application/json",
                                   "systemtype":"ios",
                                   "channel":"00",
                                   "Authorization":""]
        
        headers["auid"] = auid
        headers["appcode"] = getAppVersion()
        headers["systemversion"] = getSystemVersion()
        headers["deviceid"] = getDeviceId()
        headers["devicemodel"] = UIDevice.current.modelName
        headers["timestamp"] = getNowTimeStamp()
        headers["validtime"] = "600"
        
        return headers
    }
為了找到問題,首先用排除法,找一個不需要請求頭的資料的介面,傳入闡述,呼叫如下方法看是否能得到資料:
Alamofire.request(urlString, method: .post, parameters: param).responseJSON  { (response) in 
            print(response)
        }
呼叫之後能得到想要的資料,此時可以定位到問題出在請求頭headers引數上,檢視介面文件發現Content-type有兩種形式,其中http請求時對應value是
application/json;charset=utf-8,https請求時對應application/x-www-form-urlencoded,於是在此進行修改,後發現問題得到解決。

報此錯誤的另一種原因是,伺服器資料格式傳輸有誤。