Android Retrofit: response.errorBody не является нулевым, но response.errorBody.string () возвращает нулевое значение - PullRequest
0 голосов
/ 13 марта 2020

Я хочу записать сообщение об ошибке, когда вызов API возвращает неверный запрос или код состояния = 400

Я делаю это

call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            if(response.isSuccessful()){
                Log.e(TAG, "onResponse: "+response.message() );
                Toast.makeText(RegisterCanister.this, "Registered Successfully!", Toast.LENGTH_SHORT).show();
            }
            else {
                    try {
                    Log.e(TAG, "onResponse: "+response.errorBody().string() );
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Toast.makeText(RegisterCanister.this, "Inhaler Registration Failed", Toast.LENGTH_SHORT).show();
        }
    });

Приведенный выше код переходит в состояние else как код ответа - 400, где response.errorBody не равен NULL, но я не могу получить ответ на него. Я попытался использовать конвертер, а также JSONObject, столкнулся с той же проблемой. Не удалось извлечь информацию из лога errorBody ()

Log.e(TAG, "onResponse: "+response.errorBody().string() );

E/RegisterCanister: onResponse:

, но

Log.e(TAG, "onResponse: "+response.errorBody());

logs

E/RegisterCanister: onResponse: okhttp3.ResponseBody$1@a33dda6

мой ответ об ошибке такой же при попытке в почтальоне.

{"error":"Device not found"}

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

@ SouravSingh Сначала проверьте, что вы получите в ответе на Response.body (). String (), после Log вы узнаете, что вы получите в ответе. Другой способ - проверить, как выглядит полный пост, откройте Logcat в Verbose и найдите здесь. Здесь вы увидите все данные о подключении.

0 голосов
/ 13 марта 2020

Код ошибки должен быть перехвачен вашим объектом ответа, например (на Kotlin, но вы можете легко перевести на Java):

            when {
                response?.code() == 200 -> // Success
                    callback.onResponse(response.body())
                response?.code() != 200 -> // Error
                    callback.onError(ON_FAILURE)
            }

Вместо использования errorBody для этой цели.

В противном случае, вы можете попытаться создать пользовательский интерфейс обратного вызова:

interface YourCallback {
    fun onResponse(model: YourModel)
    fun onError(message: String)
}

Затем используйте этот интерфейс:

override fun getYourData(query: YourCall ,callback: YourCallback) {
        aCall?.yourNeed?.enqueue(object : Callback<YourModel> {
            /** Handle responses */
            override fun onResponse(call: Call<YourModel>?, response: Response<YourModel>?) {
                when {
                    response?.code() == 200 -> // Success
                        callback.onResponse(response.body())
                    response?.code() != 200 -> // Error
                        callback.onError(ON_FAILURE)
                }
            }

            /** Handle failure */
            override fun onFailure(call: Call<YourModel>?, t: Throwable?) {
                callback.onError(t?.message ?: ON_FAILURE)
            }
        })
    }

Надеюсь, он может соответствовать вашим потребностям :) Хорошо удачи.

...