我有一些工作代码从远程Web服务器上的MySQL数据库获取结果。它不再有效,我不断收到消息responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
。这是一些代码...
Alamofire.request(ADS_URL, method: .get).validate().responseJSON { response in
print("Request: \(String(describing: response.request))") // original url request
print("Response: \(String(describing: response.response))") // http url response
print("Result: \(response.result)") // response serialization result
switch response.result {
case .success(let value):
let json = JSON(value)
print ("JSON: \(json)")
if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
print("Data: \(utf8Text)") // original server data as UTF8 string
}
case .failure(let error):
print("Error while querying database: \(String(describing: error))")
return
}
}
我也在使用SwiftyJSON。以下是代码的结果......
Request: Optional(http://doyouado.com/adscan/get_ads)
Response: Optional(<NSHTTPURLResponse: 0x17502f3a0> { URL: http://doyouado.com/adscan/get_ads } { status code: 200, headers {
Connection = "keep-alive";
"Content-Length" = 0;
"Content-Type" = "text/html; charset=UTF-8";
Date = "Mon, 18 Sep 2017 16:04:37 GMT";
Server = "nginx/1.12.1";
"Set-Cookie" = "ado_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%225019d90891c70c81df8ebc2fe754a68f%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A15%3A%22109.150.214.128%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A86%3A%22ADoBroadcaster%2F1.0+%28com.GaryFrank.ADoBroadcaster%3B+build%3A1%3B+iOS+10.3.3%29+Alamofire%2F4.5.0%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1505750677%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D3130ef6f5541e6f944da5a5a1292350bf203fa1b; expires=Mon, 18-Sep-2017 18:04:37 GMT; Max-Age=7200; path=/";
} })
Result: FAILURE
Error: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
我尝试过使用.response
和.responseString
,但我没有收到任何信息。我很难受。这一切都很好。希望有人可以对此有所了解吗?
答案 0 :(得分:10)
对我来说有用的是将编码从JSONEncoding.default更改为URLEncoding.default!
答案 1 :(得分:7)
只需将.responseJSON
更改为.responseData
。
在解析数据之后:
let jsonDecoder = JSONDecoder()
let parsedData = try jsonDecoder.decode(T.self, from: data)
没有错误:
(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
答案 2 :(得分:1)
从 Alamofire 4 更新到 5 导致了我的问题。
默认情况下,Alamofire 5 似乎为空响应正文返回错误 Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength
,状态代码为 200
。因此,将 200
添加到 emptyResponseCodes 列表中为我解决了这个问题:
request.responseData(emptyResponseCodes: [200, 204, 205]) { ... } // the default is [204, 205]
答案 3 :(得分:0)
通常,当您的API为'GET'类型并且您传递'POST'类型时会出现此错误。
我面临同样的问题,我的解决方案是将.post
替换为.get
,然后删除此错误。
对于AFNetworking 3.0: - 走了路,
pods&gt; Pods&gt; AFNetworking&gt;序列化&gt; AFURLResponseSerialization.m
然后替换第228行(self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
)
与
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
由于您的回复是text/html
但AFNetworking中未提及,我们会手动添加。
注意: - 我为Alamofire调试了这个问题。
答案 4 :(得分:0)
当服务器没有发回响应时,如果要打印错误消息,Alamofire将在.failure
块中显示此消息。从技术上讲,这不是错误。 Alamofire并未在早期版本中显示此消息,但是由于最近的更新之一,它开始显示该消息。
正如我所说的,这并不是一个错误,但对我来说,这是Alamorfire中的一个错误。当客户端或服务器端没有错误时,继续在日志中看到此消息是非常令人讨厌和误导的。
这是我如何使其静音:
if (response.data?.count)! > 0 {print(error)}
当服务器没有响应时,我就会这样做,这是预期的行为,因为在某些情况下服务器不应该发送响应。
Alamofire.request(MY_URL, method: .get, parameters: ["blabla": blablabla])
.validate(statusCode: 200..<300)
.responseJSON {
response in
switch response.result {
case .success(let value):
self.processResponse(value)
case .failure(let error):
if (response.data?.count)! > 0 {print(error)}
}
}
因此,当服务器未返回任何内容时,不会显示错误消息。我认为这应该是默认行为。
答案 5 :(得分:0)
尽管这个问题已经很老了,但我想向他人提供我最近发现的东西。
由于错误消息非常笼统且无济于事,因此请检查您使用的网址格式是否正确。我发现这只是为了发现url格式不正确。一旦修复,一切就开始正常工作。
答案 6 :(得分:0)
对我有用的是从.responseData更改为.response
答案 7 :(得分:0)
我,我正在使用 alamofire 并且遇到与上面相同的错误,相当新的 ios,使用这个网站来解析 Json 响应,它对我有用:
只需粘贴您的响应,您的模型就可以解析了,感谢这个网站