Android改装:response.errorBody不是null,但response.errorBody.string()返回null

Android改装:response.errorBody不是null,但response.errorBody.string()返回null,android,api,retrofit,retrofit2,Android,Api,Retrofit,Retrofit2,我想在API调用返回错误请求或状态代码=400时记录错误消息 我正在这样做 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if(response.isSuccessful()){ Log.e(TAG, "onResponse: "+response.message()

我想在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()中提取信息

日志

但是

日志

我在《邮递员》中尝试时的错误响应是这样的

{"error":"Device not found"}

错误代码应该与响应对象一起捕获,例如(在Kotlin上,但您可以轻松地转换为Java):

而不是为此目的使用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)
            }
        })
    }
然后,使用此界面:

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)
            }
        })
    }
getYourData(查询:YourCall,回调:YourCallback){
aCall?.yourNeed?.enqueue(对象:回调{
/**处理响应*/
覆盖fun onResponse(调用:调用?,响应:响应?){
什么时候{
响应?.code()==200->//成功
callback.onResponse(response.body())
响应?.code()!=200->//错误
callback.onError(发生故障时)
}
}
/**处理失败*/
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
callback.onError(t?.message?:ON_失败)
}
})
}
希望它能满足您的需要:)
祝你好运。

@SouravSingh首先通过日志检查你在response.body().string()的答案中得到了什么,然后你就会知道你在答案中得到了什么。另一种方法是检查如何在Verbose中查看完整post open Logcat,并在此处找到post,您将看到有关连接的所有数据。

解决方案仅使用代码response.errorBody().string()一次

尝试更改代码,如回答@alexTykhonov getting exception“字符0处的输入结束”,如果我没有错,这是因为JSONobject没有被创建为响应。errorBody.string()返回null。您能显示您的josn和model@Amitpandey这有什么关系?因为我没有打任何形式的电话。这是ResponseBody类型我正在寻找Java的解决方案!谢谢你的帮助。
            when {
                response?.code() == 200 -> // Success
                    callback.onResponse(response.body())
                response?.code() != 200 -> // Error
                    callback.onError(ON_FAILURE)
            }
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)
            }
        })
    }