gfg*_*vin 9 swift alamofire swifty-json
我有一些工作代码从远程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
}
}
Run Code Online (Sandbox Code Playgroud)
我也在使用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)
Run Code Online (Sandbox Code Playgroud)
我尝试过使用.response和.responseString,但我没有收到任何信息.我很难受.这一切都很好.希望有人可以对此有所了解吗?
小智 11
在我的案例中,从 Alamofire 4 更新到 5 导致了这个问题。默认情况下,Alamofire 5 似乎会返回Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength带有状态码 的空响应正文的错误200。因此,添加200到emptyResponseCodes列表中解决了我的问题:
request.responseData(emptyResponseCodes: [200, 204, 205]) { ... } // the default is [204, 205]
Run Code Online (Sandbox Code Playgroud)
小智 8
只需.responseJSON改为.responseData.
在解析数据之后:
let jsonDecoder = JSONDecoder()
let parsedData = try jsonDecoder.decode(T.self, from: data)
Run Code Online (Sandbox Code Playgroud)
并且没有错误:
(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
Run Code Online (Sandbox Code Playgroud)
当您的 API 为“GET”类型并且您传递“POST”类型时,通常会出现此错误。
我遇到了同样的问题,我的解决方案是替换.post为.get,然后删除此错误。
对于 AFNetworking 3.0:- 转到给定路径,
pod > Pod > 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];
Run Code Online (Sandbox Code Playgroud)
由于您的回复形式为 ,text/html但 AFNetworking 中未提及,因此我们手动添加。
注意:- 我为 Alamofire 调试此问题。
| 归档时间: |
|
| 查看次数: |
13151 次 |
| 最近记录: |