我有一些工作代码,这些代码正在从远程Web服务器上的MySQL DB获得结果。它不再起作用,我不断收到消息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
,但是我没有返回信息。我很完整。这一切都很好。希望有人可以阐明这一点?
只需将 .responseJSON
更改为 .responseData
。
和此解析数据之后:
let jsonDecoder = JSONDecoder()
let parsedData = try jsonDecoder.decode(T.self, from: data)
且无错误:
(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
对我有用的是将编码从jsonencoding.default更改为urlencoding.default!
在我的情况下,从alamofire 4到5进行更新引起了问题。默认情况下,Alamofire 5似乎返回带有状态代码200
的空响应主体的错误Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength
。因此,将200
添加到emptyResponsecodes的列表中为我解决了问题:
request.responseData(emptyResponseCodes: [200, 204, 205]) { ... } // the default is [204, 205]
对我有用的是从.responsedata变为.response
通常,当您的API为'get'类型并通过'post'type时,此错误会出现。
我遇到的问题和解决方案是将.post
替换为.get
,然后删除了此错误。
用于afnetworking 3.0: - 走路路径,
pods> pods> afnetworking>序列化> 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
的形式做出响应
注意: - 我为Alamofire调试了这个问题。
当服务器发送没有响应时,Alamofire如果打印错误消息,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)}
}
}
因此,错误消息不会显示从服务器返回什么时候。我认为这应该是默认行为。
尽管问题很旧,但我想向其他人提供我最近发现的东西。
由于错误消息非常通用,而且无济于事,因此请检查您使用的URL格式是否正确。我已经找到了这一点,只是发现URL格式不正确。固定的事情开始正常工作。