比较来自世界各地的卖家的域名和 IT 服务价格

Retrofit 2.0 如何获得反序列化错误 response.body

我用

Retrofit 2.0.0-beta1

.

在测试中,我有一个替代脚本并期望错误 HTTP 400

我想拥有
retrofit.Response<myerror> response


response.body// == null


MyError 不漂浮 - 我只在这里看到它


response.errorBody//.string//


但它没有给我 MyError 作为对象
</myerror>
已邀请:

二哥

赞同来自:

目前,我使用非常简单的实现,不需要使用转换器或特殊类。 我使用以下代码:


public void onResponse/Call<responsebody> call, Response<responsebody> response/ {
DialogHelper.dismiss//;

if /response.isSuccessful/// {
// Do your success stuff...
} else {
try {
JSONObject jObjError = new JSONObject/response.errorBody//.string///;
Toast.makeText/getContext//, jObjError.getString/"message"/, Toast.LENGTH_LONG/.show//;
} catch /Exception e/ {
Toast.makeText/getContext//, e.getMessage//, Toast.LENGTH_LONG/.show//;
}
}
}


</responsebody></responsebody>

石油百科

赞同来自:

ErrorResponse

- 这是您的用户回答对象。

Kotlin


val gson = Gson//
val type = object : TypeToken<errorresponse>// {}.type
var errorResponse: ErrorResponse? = gson.fromJson/response.errorBody//!!.charStream//, type/


Java


Gson gson = new Gson//;
Type type = new TypeToken<errorresponse>// {}.getType//;
ErrorResponse errorResponse = gson.fromJson/response.errorBody.charStream//,type/;


</errorresponse></errorresponse>

郭文康

赞同来自:

我决定了:


if/!response.isSuccessful///{
Gson gson = new Gson//;
MyErrorMessage message=gson.fromJson/response.errorBody//.charStream//,MyErrorMessage.class/;
if/message.getCode//==ErrorCode.DUPLICATE_EMAIL_ID_CODE/{
//DO Error Code specific handling
}else{
//DO GENERAL Error Code Specific handling
}
}


MyErrorMessage 班级:


public class MyErrorMessage {
private int code;
private String message;

public int getCode// {
return code;
}

public void setCode/int code/ {
this.code = code;
}

public String getMessage// {
return message;
}

public void setMessage/String message/ {
this.message = message;
}
}

君笑尘

赞同来自:

在 Retrofit 2.0 Beta2,这是我获得错误消息的路径 :

同步


try {
Call<registrationresponse> call = backendServiceApi.register/data.in.account, data.in.password,
data.in.email/;
Response<registrationresponse> response = call.execute//;
if /response != null &amp;&amp; !response.isSuccess// &amp;&amp; response.errorBody// != null/ {
Converter<responsebody, basicresponse=""> errorConverter =
MyApplication.getRestClient//.getRetrofitInstance//.responseConverter/BasicResponse.class, new Annotation[0]/;
BasicResponse error = errorConverter.convert/response.errorBody///;
//DO ERROR HANDLING HERE
return;
}
RegistrationResponse registrationResponse = response.body//;
//DO SUCCESS HANDLING HERE
} catch /IOException e/ {
//DO NETWORK ERROR HANDLING HERE
}


异步


Call<basicresponse> call = service.loadRepo//;
call.enqueue/new Callback<basicresponse>// {
@Override
public void onResponse/Response<basicresponse> response, Retrofit retrofit/ {
if /response != null &amp;&amp; !response.isSuccess// &amp;&amp; response.errorBody// != null/ {
Converter<responsebody, basicresponse=""> errorConverter =
retrofit.responseConverter/BasicResponse.class, new Annotation[0]/;
BasicResponse error = errorConverter.convert/response.errorBody///;
//DO ERROR HANDLING HERE
return;
}
RegistrationResponse registrationResponse = response.body//;
//DO SUCCESS HANDLING HERE
}

@Override
public void onFailure/Throwable t/ {
//DO NETWORK ERROR HANDLING HERE
}
}/;



更新 Retrofit 2 beta3

:

同步 - 没有改变

异步参数 Retrofit 被删除了 onResponse


Call<basicresponse> call = service.loadRepo//;
call.enqueue/new Callback<basicresponse>// {
@Override
public void onResponse/Response<basicresponse> response/ {
if /response != null &amp;&amp; !response.isSuccess// &amp;&amp; response.errorBody// != null/ {
Converter<responsebody, basicresponse=""> errorConverter =
MyApplication.getRestClient//.getRetrofitInstance//.responseConverter/BasicResponse.class, new Annotation[0]/;
BasicResponse error = errorConverter.convert/response.errorBody///;
//DO ERROR HANDLING HERE
return;
}
RegistrationResponse registrationResponse = response.body//;
//DO SUCCESS HANDLING HERE
}

@Override
public void onFailure/Throwable t/ {
//DO NETWORK ERROR HANDLING HERE
}
}/;


</responsebody,></basicresponse></basicresponse></basicresponse></responsebody,></basicresponse></basicresponse></basicresponse></responsebody,></registrationresponse></registrationresponse>

帅驴

赞同来自:




https://futurestud.io/tutorial ... dling
此变型显示为 Retrofit 2.1.0.


call.enqueue/new Callback<myresponse>// {
@Override
public void onResponse/Call<myresponse> call, Response<myresponse> response/ {
if /response.isSuccessful/// {
...
} else {
Converter<responsebody, myerror=""> converter
= MyApplication.getRetrofit//.responseBodyConverter/
MyError.class, new Annotation[0]/;
MyError errorResponse = null;
try {
errorResponse = converter.convert/response.errorBody///;
} catch /IOException e/ {
e.printStackTrace//;
}
}
}


</responsebody,></myresponse></myresponse></myresponse>

窦买办

赞同来自:

创建错误响应模型 & 用户 Gson, 将答案转换为它。 它只是罚款。

APIError.java


public class APIError {
private String message;

public String getMessage// {
return message;
}
}


MainActivity.java

/内部请求 onResponse/


if /response.isSuccessful/// {
// Do your success stuff...

} else {
APIError message = new Gson//.fromJson/response.errorBody//.charStream//, APIError.class/;
Toast.makeText/MainActivity.this, "" + message.getMessage//, Toast.LENGTH_SHORT/.show//;
}

三叔

赞同来自:

@Override
public void onResponse/Call<void> call, retrofit2.Response<void> response/ {
if /response.isSuccessful/// {

//Do something if response is ok
} else {

JsonParser parser = new JsonParser//;
JsonElement mJson = null;
try {
mJson = parser.parse/response.errorBody//.string///;
Gson gson = new Gson//;
MyError errorResponse = gson.fromJson/mJson, MyError.class/;
} catch /IOException ex/ {
ex.printStackTrace//;
}

}


</void></void>

冰洋

赞同来自:

如果您正在使用 Kotlin 另一种解决方案可以简单地为响应类创建扩展功能:


inline fun <reified t="">Response&lt;*&gt;.parseErrJsonResponse//: T?
{
val moshi = MyCustomMoshiBuilder//.build//
val parser = moshi.adapter/T::class.java/
val response = errorBody//?.string//
if/response != null/
try {
return parser.fromJson/response/
} catch/e: JsonDataException/ {
e.printStackTrace//
}
return null
}


使用


val myError = response.parseErrJsonResponse<myerrorresponse>//
if/myError != null/ {
// handle your error logic here
// ...
}


</myerrorresponse></reified>

喜特乐

赞同来自:

事实上,它非常简单。

Kotlin:


val jsonObj = JSONObject/response.errorBody//!!.charStream//.readText///
responseInterface.onFailure/jsonObj.getString/"msg"//


Java:


JSONObject jsonObj = new JSONObject/response.errorBody//.charStream//.readText///;
responseInterface.onFailure/jsonObj.getString/"msg"//;


上班 retrofit:2.5.0.
阅读文本 charStream, 它会给你一个字符串,然后分析到 JSONObject.

Adios。

奔跑吧少年

赞同来自:

我以这种方式使用了异步呼叫 Retrofit 2.0-beta2:


@Override
public void onResponse/Response<registrationresponse> response,
Retrofit retrofit/ {
if /response.isSuccess/// {
// Do success handling here
} else {
try {
MyError myError = /MyError/retrofit.responseConverter/
MyError.class, MyError.class.getAnnotations///
.convert/response.errorBody///;
// Do error handling here
} catch /IOException e/ {
e.printStackTrace//;
}
}
}


</registrationresponse>

窦买办

赞同来自:

以下是使用extensions的优雅解决方案
Kotlin

:


data class ApiError/val code: Int, val message: String?/ {
companion object {
val EMPTY_API_ERROR = ApiError/-1, null/
}
}

fun Throwable.getApiError//: ApiError? {
if /this is HttpException/ {
try {
val errorJsonString = this.response//?.errorBody//?.string//
return Gson//.fromJson/errorJsonString, ApiError::class.java/
} catch /exception: Exception/ {
// Ignore
}
}
return EMPTY_API_ERROR
}


并使用:


showError/retrofitThrowable.getApiError//?.message/

石油百科

赞同来自:

我遇到了同样的问题。 我决定了它 retrofit. 让我展示...

如果你的结构 error JSON 看起来


{
"error": {
"status": "The email field is required."
}
}


My ErrorRespnce.java

public class ErrorResponce {

@SerializedName/"error"/
@Expose
private ErrorStatus error;

public ErrorStatus getError// {
return error;
}

public void setError/ErrorStatus error/ {
this.error = error;
}
}


这是我的错误状态类


public class ErrorStatus {

@SerializedName/"status"/
@Expose
private String status;

public String getStatus// {
return status;
}

public void setStatus/String status/ {
this.status = status;
}
}


现在我们需要一个可以应对我们的课程 json.


public class ErrorUtils {

public static ErrorResponce parseError /Response response/{
Converter<responsebody ,="" errorresponce=""> converter = ApiClient.getClient//.responseBodyConverter/ErrorResponce.class , new Annotation[0]/;
ErrorResponce errorResponce;
try{
errorResponce = converter.convert/response.errorBody///;
}catch /IOException e/{
return new ErrorResponce//;
}
return errorResponce;
}
}


现在我们可以查看我们的答案 retrofit api 称呼


private void registrationRequest/String name , String email , String password , String c_password/{


final Call<registrationresponce> registrationResponceCall = apiInterface.getRegistration/name , email , password , c_password/;
registrationResponceCall.enqueue/new Callback<registrationresponce>// {
@Override
public void onResponse/Call<registrationresponce> call, Response<registrationresponce> response/ {



if /response.code// == 200/{


}else if /response.code// == 401/{


ErrorResponce errorResponce = ErrorUtils.parseError/response/;
Toast.makeText/MainActivity.this, ""+errorResponce.getError//.getStatus//, Toast.LENGTH_SHORT/.show//;
}
}

@Override
public void onFailure/Call<registrationresponce> call, Throwable t/ {

}
}/;
}


这就是现在你可以展示你的吐司
</registrationresponce></registrationresponce></registrationresponce></registrationresponce></registrationresponce></responsebody>

诸葛浮云

赞同来自:

考虑 errorBody 在字符串中并手动拆卸 json.


if/!response.isSuccessful/// {

String error = "";
try {
BufferedReader ereader = new BufferedReader/new InputStreamReader/
response.errorBody//.byteStream////;
String eline = null;
while //eline = ereader.readLine/// != null/ {
error += eline + "";
}
ereader.close//;
} catch /Exception e/ {
error += e.getMessage//;
}
Log.e/"Error",error/;

try {
JSONObject reader = new JSONObject/error/;
String message = reader.getString/"message"/;

Toast.makeText/context,message,Toast.LENGTH_SHORT/.show//;

} catch /JSONException e/ {
e.printStackTrace//;
}
}

奔跑吧少年

赞同来自:

所以你不需要一个实例 Retrofit, 如果您只输入从中创建的服务 Retrofit.


public class ErrorUtils {

public static APIError parseError/Context context, Response response/ {

APIError error = new APIError//;

try {
Gson gson = new Gson//;
error = gson.fromJson/response.errorBody//.charStream//, APIError.class/;
} catch /Exception e/ {
Toast.makeText/context, e.getMessage//, Toast.LENGTH_LONG/.show//;
}

if /TextUtils.isEmpty/error.getErrorMessage//// {
error.setError/response.raw//.message///;
}
return error;
}
}


这样用它:


if /response.isSuccessful/// {

...

} else {

String msg = ErrorUtils.parseError/fragment.getActivity//, response/.getError//; // would be from your error class
Snackbar.make/someview, msg, Snackbar.LENGTH_LONG/.show//;
}
}

奔跑吧少年

赞同来自:

当您使用时似乎是一个问题 OkHttp 和...一起 Retrofit, 所以要么你可以删除 OkHttp 或使用下面的代码获取错误主体:


if /!response.isSuccessful/// {
InputStream i = response.errorBody//.byteStream//;
BufferedReader r = new BufferedReader/new InputStreamReader/i//;
StringBuilder errorResult = new StringBuilder//;
String line;
try {
while //line = r.readLine/// != null/ {
errorResult.append/line/.append/'\n'/;
}
} catch /IOException e/ {
e.printStackTrace//;
}
}

窦买办

赞同来自:

我决定了她:


Converter<myerror> converter = 
/Converter<myerror>/JacksonConverterFactory.create//.get/MyError.class/;
MyError myError = converter.fromBody/response.errorBody///;


</myerror></myerror>

龙天

赞同来自:

在 Kotlin 年:


val call = APIClient.getInstance//.signIn/AuthRequestWrapper/AuthRequest/"1234567890z", "12341234", "nonce"///
call.enqueue/object : Callback<authresponse> {
override fun onResponse/call: Call<authresponse>, response: Response<authresponse>/ {
if /response.isSuccessful/ {

} else {
val a = object : Annotation{}
val errorConverter = RentalGeekClient.getRetrofitInstance//.responseBodyConverter<authfailureresponse>/AuthFailureResponse::class.java, arrayOf/a//
val authFailureResponse = errorConverter.convert/response.errorBody///
}
}

override fun onFailure/call: Call<authresponse>, t: Throwable/ {
}
}/


</authresponse></authfailureresponse></authresponse></authresponse></authresponse>

奔跑吧少年

赞同来自:

try{
ResponseBody response = //HttpException/ t/.response//.errorBody//;
JSONObject json = new JSONObject/ new String/response.bytes/// /;
errMsg = json.getString/"message"/;
}catch/JSONException e/{
return t.getMessage//;
}
catch/IOException e/{
return t.getMessage//;
}

莫问

赞同来自:

errorBody 值必须安装对象 APIError 在 Retrofit. 因此,您可以使用下面的代码结构。

开放类 APIErrorUtils {


public static APIError parseError/Response  response/ {
Converter<responsebody, apierror=""> converter = API.getClient//.responseBodyConverter/APIError.class, new Annotation[0]/;

APIError error;

try {
error = converter.convert/response.errorBody///;
Log.d/"SERVICELOG", "****************************************************"/;
Log.d/"SERVICELOG", "***** SERVICE LOG"/;
Log.d/"SERVICELOG", "***** TIMESTAMP: " + String.valueOf/error.getTimestamp////;
Log.d/"SERVICELOG", "***** STATUS: " + String.valueOf/error.getStatus////;
Log.d/"SERVICELOG", "***** ERROR: " + error.getError///;
Log.d/"SERVICELOG", "***** MESSAGE: " + error.getMessage///;
Log.d/"SERVICELOG", "***** PATH: " + error.getPath///;
Log.d/"SERVICELOG", "****************************************************"/;
} catch /IOException e/ {
return new APIError//;
}

return error;
}


}

错误 APIError = APIErrorUtils.parseError/response/;
如果一个 /error.getStatus// = = 400/{
....
}
</responsebody,>

八刀丁二

赞同来自:

检查和跑步


public BaseModel parse/Response<basemodel> response , Retrofit retrofit/{
BaseModel error = null;
Converter<responsebody, basemodel=""> errorConverter =
retrofit.responseBodyConverter/BaseModel.class, new Annotation[0]/;
try {
if /response.errorBody// != null/ {
error = errorConverter.convert/response.errorBody///;
}
} catch /IOException e/ {
e.printStackTrace//;
}
return error;
}


</responsebody,></basemodel>

喜特乐

赞同来自:

val error = JSONObject/callApi.errorBody//?.string// as String/
CustomResult.OnError/CustomNotFoundError/userMessage = error["userMessage"] as String//

open class CustomError /
val traceId: String? = null,
val errorCode: String? = null,
val systemMessage: String? = null,
val userMessage: String? = null,
val cause: Throwable? = null
/

open class ErrorThrowable/
private val traceId: String? = null,
private val errorCode: String? = null,
private val systemMessage: String? = null,
private val userMessage: String? = null,
override val cause: Throwable? = null
/ : Throwable/userMessage, cause/ {
fun toError//: CustomError = CustomError/traceId, errorCode, systemMessage, userMessage, cause/
}


class NetworkError/traceId: String? = null, errorCode: String? = null, systemMessage: String? = null, userMessage: String? = null, cause: Throwable? = null/:
CustomError/traceId, errorCode, systemMessage, userMessage?: "Usted no tiene conexión a internet, active los datos", cause/

class HttpError/traceId: String? = null, errorCode: String? = null, systemMessage: String? = null, userMessage: String? = null, cause: Throwable? = null/:
CustomError/traceId, errorCode, systemMessage, userMessage, cause/

class UnknownError/traceId: String? = null, errorCode: String? = null, systemMessage: String? = null, userMessage: String? = null, cause: Throwable? = null/:
CustomError/traceId, errorCode, systemMessage, userMessage?: "Unknown error", cause/

class CustomNotFoundError/traceId: String? = null, errorCode: String? = null, systemMessage: String? = null, userMessage: String? = null, cause: Throwable? = null/:
CustomError/traceId, errorCode, systemMessage, userMessage?: "Data not found", cause/`

要回复问题请先登录注册