alamofire响应序列化(alamofire.aferror.ressereserializationfailure



我有一些工作代码,这些代码正在从远程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格式不正确。固定的事情开始正常工作。

最新更新