我在本地服务器上调用API来验证是否发生了错误400。此错误按预期发生。在这一刻,我想得到价值。它是一个JSON对象。 来自服务器的消息即将到来,但某些时刻的价值消失了。我知道这是因为我调试了应用程序。在来自Retrofit的response.errorBody()。string()消息的第一个响应中,字符串值就在那里。但是在响应之后,值变为空。我用图像来说明发生了什么。
我的代码是:
public class ServerResponse implements Parcelable {
@SerializedName("message")
private String message;
public ServerResponse(){}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(message);
}
public ServerResponse(String message){
this.message = message;
}
private ServerResponse(Parcel parcel){
message = parcel.readString();
}
public static final Parcelable.Creator<ServerResponse> CREATOR =
new Parcelable.Creator<ServerResponse>() {
public ServerResponse createFromParcel(Parcel in) {
return new ServerResponse(in);
}
public ServerResponse[] newArray(int size) {
return new ServerResponse[size];
}
};
public String getMessage(){
return message;
}
}
这是另一段代码:
super.data.restApi(WorkOrderAPI.class)
.answerWorkOrder(
t,
workOrderId,
request.getQuestionFormId(),
isOffline ? 1 : 0,
request)
.enqueue(new Callback<ServerResponse>() {
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
if (response.isSuccessful()) {
onResult.onSuccessful(null);
} else {
try {
if(response.code() == 400) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateTypeDeserializer())
.create();
ServerResponse serverResponse = gson.fromJson(response.errorBody().charStream(), ServerResponse.class);
onResult.onUnsuccessful(new DefaultError(response.code(), serverResponse.getMessage()));
}
为什么在第一行代码后值会消失?
答案 0 :(得分:2)
答案 1 :(得分:1)
基本上发生的事情是:
在第一个if(response.code() == 400)
中,您获得了errorBody,并且您要求Gson解析它。所以现在JSON已被消耗,它已经消失了。
然后当达到第二个if(response.code() == 400)
时,就不再有JSON了。
问题是:为什么要两次解析errorBody?
只是做:
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
if (response.isSuccessful()) {
onResult.onSuccessful(null);
} else {
try {
if(response.code() == 400) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateTypeDeserializer())
.create();
ServerResponse serverResponse = gson.fromJson(response.errorBody().charStream(), ServerResponse.class);
onResult.onUnsuccessful(new DefaultError(response.code(), serverResponse.getMessage()));
}
}
// ... catch...
}
}
答案 2 :(得分:0)
发现错误。就像受访者说我要消费两次。我在调试时使用它。在图片上看到它。