Alamofire responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

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

对我有用的是将编码从JSONEncoding.default更改为URLEncoding.default!


小智 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)

  • @thibautnoah 因为空字符串不是有效的 json (2认同)

Asi*_*ati 5

对我有用的是从 .responseData 更改为 .response


Bij*_*wat 0

当您的 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 调试此问题。