Ich habe Basisklasse für meine Antworten. Diese Klasse wird aufgerufen, wenn ein Problem auftritt (z. B. ein Authentifizierungsproblem).Retrofit2, wie Antwort auf Basisklasse konvertieren?
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)
{
}
}
}
...
}
Der Rest der Antworten erweitern diese Klasse.
public class FeatureResponse extends DefaultResponse
{
// Implementation
}
Dies ist die Methode, die ich bin mit der API, um Funktionen zu erhalten, rufen.
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);
}
});
}
Als ich die Anfrage senden, das ist meine Server-Antwort:
{"status":403,"code":4030,"property":"","message":"Unauthorized access","developerMessage":"Unauthorized access"}
Daher wird onResponse
genannt, neues Objekt der FeatureResponse
erstellt wird und featureResponse.setResponse(response);
wird aufgerufen. Wie Sie im obigen Code sehen, versuche ich seinen HTTP-Statuscode zu erhalten. Allerdings ist das Problem if (obj != null && obj instanceof DefaultResponse)
ist immer false
als response
ist Instanz der Klasse Retrofit2.Response.
Ist es möglich, Response
in DefaultResponse
zu konvertieren?
ehrfürchtige bro, sehr hilfreich. Mein anderes Problem war 'status', das auf Transient gesetzt wurde (von der vorherigen Version). Ich habe das geändert und die Serverantwort jetzt analysiert. Vielen Dank. – Hesam
Sie sind willkommen, froh, Ihr Problem zu beheben. Haben Sie einen guten Tag :) –