web-dev-qa-db-ja.com

Alamofire responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

リモート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を使用しようとしましたが、情報が返されません。私は完全に困惑しています。これはすべて正常に機能していました。うまくいけば、これにいくらか光を当てることができる人がいますか?

9
gfgruvin

私のために働いたのは、エンコードをJSONEncoding.defaultからURLEncoding.defaultに変更することでした!

11
Will Said

単に.responseJSONから.responseData

そして、このデータを解析した後:

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

エラーなし:

(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
8
Igor Kruglik

質問はかなり古いものですが、最近発見したことを他の人に提供したかったのです。

エラーメッセージは非常に一般的であり、あまり役に立たないため、使用しているURL形式が正しいことを確認してください。これは、URLの形式が正しくないことを発見するためだけに得ました。修正すると、問題なく動作し始めました。

0
Micah Montoya

サーバーが応答を返さない場合、エラーメッセージを出力している場合、Alamofireはこのメッセージを_.failure_ブロックに表示します。技術的にはエラーではありません。 Alamofireは以前のバージョンではこのメッセージを表示しませんでしたが、最近のアップデートの1つから表示され始めました。

私が言ったように、それは本当にエラーではありませんが、私にとっては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)}
            }
    }
_

そのため、サーバーから何も返されない場合、エラーメッセージは表示されません。私の意見では、これはデフォルトの動作です。

0
zeeshan

通常、このエラーは、APIが「GET」タイプで、「POST」タイプを渡すときに発生します。

私が直面した同じ問題と私の解決策は、.post.getに置き換えてから、このエラーを取り除いたことです。

AFNetworking 3.0の場合:-指定されたパスに移動し、

ポッド>ポッド> 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の形式での応答のために、AFNetworkingに記載されていないため、手動で追加します。

注:-Alamofireでこの問題をデバッグします。