无法获得改造响应价值

问题描述 投票:0回答:3

我正在调用API本地服务器来验证错误400是否正在发生。此错误按预期发生。在这一刻,我想得到价值。这是一个JSON对象。来自服务器的消息即将到来,但某些时刻的价值消失了。我知道这是因为我调试了应用程序。在来自Retrofit的response.errorBody()。string()消息的第一个响应中,字符串值就在那里。但是在响应之后,值变为空。我用图像来说明发生了什么。

enter image description here

我的代码是:

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()));
                            }

为什么在第一行代码后值消失了?

android retrofit2
3个回答
2
投票

来自documentation

响应主体只能被消耗一次。

你正在消费它两次。第一次返回值,第二次返回null。


1
投票

基本上发生的是:

在第一个if(response.code() == 400),你得到了错误的身体,你要求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...
    }   
}

0
投票

发现错误。就像受访者说我正在消费它两次。我正在调试它。在图片上看到它。

© www.soinside.com 2019 - 2024. All rights reserved.