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,于是在此进行修改,后发现问题得到解决。
报此错误的另一种原因是,服务器数据格式传输有误。