Retrofit2,如何将响应转换为基class?
Retrofit2, how to convert response to base class?
我的回复有基础 class。当出现问题(例如身份验证问题)时,将调用此 class。
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)
{
}
}
}
...
}
其余回复正在扩展此 class。
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
是 class retrofit2.Response.
的实例
是否可以将 Response
转换为 DefaultResponse
?
当我收到诸如 401 之类的错误时,400 正在使用这种方式 Gson
:
if (response.code() == 400)
{
Gson gson = new GsonBuilder().create();
MyPojoError myPojoError=new MyPojoError ();
try {
myPojoError= gson.fromJson(response.errorBody().string(),MyPojoError .class);
} catch (IOException e) { // handle failure to read error }
}
在使用 Gson
将响应转换为 Pojo
时,您还需要注释:
public class MyPojoError {
@SerializedName("error")
@Expose
private String error;
@SerializedName("error_description")
@Expose
private String errorDescription;
/**
*
* @return
* The error
*/
public String getError() {
return error;
}
/**
*
* @param error
* The error
*/
public void setError(String error) {
this.error = error;
}
/**
*
* @return
* The errorDescription
*/
public String getErrorDescription() {
return errorDescription;
}
/**
*
* @param errorDescription
* The error_description
*/
public void setErrorDescription(String errorDescription) {
this.errorDescription = errorDescription;
}
}
粘贴您的示例 Json
对站点的响应,select 源类型 JSON,注释:Gson : Json Schema to Pojo
在你的 build.gradle
中:compile 'com.google.code.gson:gson:2.6.2'
我的回复有基础 class。当出现问题(例如身份验证问题)时,将调用此 class。
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)
{
}
}
}
...
}
其余回复正在扩展此 class。
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
是 class retrofit2.Response.
是否可以将 Response
转换为 DefaultResponse
?
当我收到诸如 401 之类的错误时,400 正在使用这种方式 Gson
:
if (response.code() == 400)
{
Gson gson = new GsonBuilder().create();
MyPojoError myPojoError=new MyPojoError ();
try {
myPojoError= gson.fromJson(response.errorBody().string(),MyPojoError .class);
} catch (IOException e) { // handle failure to read error }
}
在使用 Gson
将响应转换为 Pojo
时,您还需要注释:
public class MyPojoError {
@SerializedName("error")
@Expose
private String error;
@SerializedName("error_description")
@Expose
private String errorDescription;
/**
*
* @return
* The error
*/
public String getError() {
return error;
}
/**
*
* @param error
* The error
*/
public void setError(String error) {
this.error = error;
}
/**
*
* @return
* The errorDescription
*/
public String getErrorDescription() {
return errorDescription;
}
/**
*
* @param errorDescription
* The error_description
*/
public void setErrorDescription(String errorDescription) {
this.errorDescription = errorDescription;
}
}
粘贴您的示例 Json
对站点的响应,select 源类型 JSON,注释:Gson : Json Schema to Pojo
在你的 build.gradle
中:compile 'com.google.code.gson:gson:2.6.2'