Android改装:response.errorBody不是null,但response.errorBody.string()返回null
我想在API调用返回错误请求或状态代码=400时记录错误消息 我正在这样做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()
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)
}
})
}