Alamofire 網路請求報錯 Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed
阿新 • • 發佈:2019-02-20
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,於是在此進行修改,後發現問題得到解決。
報此錯誤的另一種原因是,伺服器資料格式傳輸有誤。