У меня есть базовый класс для моих ответов. Этот класс вызывается при возникновении проблемы (например, проблема аутентификации).Retrofit2, как преобразовать ответ в базовый класс?
public class DefaultResponse
{
private transient Integer status;
private String property;
private String message;
private String developerMessage;
protected String code;
public void setResponse(final Response response)
{
if (this.status != null)
{
return;
}
if (response != null)
{
try
{
final Object obj = response.body();
if (obj != null && obj instanceof DefaultResponse)
{
this.status = response.code();
this.message = ((DefaultResponse) obj).message;
this.developerMessage = ((DefaultResponse) obj).developerMessage;
this.property = ((DefaultResponse) obj).property;
this.code = ((DefaultResponse) obj).code;
}
}
catch (final Exception ignored)
{
}
}
}
...
}
Остальные ответы распространяются на этот класс.
public class FeatureResponse extends DefaultResponse
{
// Implementation
}
Это метод, который я использую для вызова API, чтобы получить функции.
public void getFeatures(final Location location)
{
Call<FeatureResponse> call = mService.getPassengerFeatures(location);
call.enqueue(new Callback<FeatureResponse>()
{
@Override
public void onResponse(Call<FeatureResponse> call, Response<FeatureResponse> response)
{
Logger.debug("Test", "Instance of response: " + response.getClass());
FeatureResponse featureResponse = new FeatureResponse();
if (response.isSuccessful())
{
//...
}
featureResponse.setResponse(response);
EventBus.post(featureResponse);
}
@Override
public void onFailure(Call<FeatureResponse> call, Throwable t)
{
Logger.error(TAG, "getPassengerFeatures.onFailure(), msg: " + t.getMessage());
FeatureResponse featureResponse = new FeatureResponse();
featureResponse.setFailure(t);
EventBus.post(featureResponse);
}
});
}
Когда я отправить запрос, это мой ответ сервера:
{"status":403,"code":4030,"property":"","message":"Unauthorized access","developerMessage":"Unauthorized access"}
Поэтому onResponse
вызывается, новый объект FeatureResponse
получает создан и featureResponse.setResponse(response);
вызывается. Как вы видите в приведенном выше коде, я пытаюсь получить его код статуса HTTP. Однако проблема if (obj != null && obj instanceof DefaultResponse)
всегда false
как response
является экземпляром класса retrofit2.Response.
Можно ли преобразовать Response
в DefaultResponse
?
удивительным братан, очень полезно. Другой проблемой был «статус», который был установлен в Transient (из предыдущей версии). Я изменил это, и теперь я разбираю ответ сервера. Благодарю. – Hesam
, пожалуйста, рада исправить вашу проблему. Хорошего дня :) –