Alamofire responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

时间:2017-09-18 16:29:44

标签: 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
        }
    }

我也在使用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,但我没有收到任何信息。我很难受。这一切都很好。希望有人可以对此有所了解吗?

8 个答案:

答案 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 响应,它对我有用:

https://quicktype.io/

只需粘贴您的响应,您的模型就可以解析了,感谢这个网站