私の回答には基本クラスがあります。このクラスは、問題が発生したときに呼び出されます(認証の問題など)。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);
}
});
}
私がリクエストを送信すると、これは私のサーバーの応答である:したがって、onResponse
が呼び出される
{"status":403,"code":4030,"property":"","message":"Unauthorized access","developerMessage":"Unauthorized access"}
、FeatureResponse
の新しいオブジェクトが作成されますとfeatureResponse.setResponse(response);
が呼び出されます。上のコードでわかるように、私はHTTPステータスコードを取得しようとしています。しかし、問題はif (obj != null && obj instanceof DefaultResponse)
は常にfalse
であり、response
はクラスretrofit2.Responseのインスタンスです。
Response
をDefaultResponse
に変換することはできますか?
素晴らしい仲間、非常に役立ちます。私の他の問題は、(以前のバージョンの)Transientに設定された 'status'でした。私はそれを変更し、私は今サーバーの応答を解析します。ありがとう。 – Hesam
あなたの問題を解決してうれしいです。良い一日を過ごしてください :) –