Alamofire responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

30,095

Solution 1

Just simply change .responseJSON to .responseData.

And after this parse data:

let jsonDecoder = JSONDecoder() 
let parsedData = try jsonDecoder.decode(T.self, from: data)

and no error:

(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

Solution 2

What worked for me was changing the encoding from JSONEncoding.default to URLEncoding.default!

Solution 3

Updating from Alamofire 4 to 5 caused the issue in my case. By default, it seems that Alamofire 5 returns the error Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength for empty response body with status code 200. So adding 200 to the list of emptyResponseCodes resolved the issue for me:

request.responseData(emptyResponseCodes: [200, 204, 205]) { ... } // the default is [204, 205]

Solution 4

What worked for me was changing from .responseData to .response

Share:
30,095
gfgruvin
Author by

gfgruvin

Updated on July 28, 2021

Comments

  • gfgruvin
    gfgruvin almost 3 years

    I had some working code that was getting results from a MySQL DB on a remote web server. It is no longer working and I keep getting the message responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength). Here is some code...

        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
            }
        }
    

    I am also using SwiftyJSON. Here are the results of the code...

    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)
    

    I have tried using .response and .responseString, but I get no information returned. I am completley stumped. This was all working fine. Hopefully there is someone that can shed some light on this?