2017-12-18 5 views
0

エラー400が発生しているかどうかを確認するためにAPIをローカルサーバーと呼びます。このエラーは、期待どおりに発生します。この瞬間、私は価値を得たいと思っています。これはJSONオブジェクトです。 サーバーからのメッセージが到着していますが、しばらくしても値が表示されません。私はアプリをデバッグしているので、私はそれを知っている。 Retrofitのresponse.errorBody()。string()メッセージからの最初の応答では、文字列値がそこにあります。しかし、応答の直後に値はnullになります。私は何が起こっているのかをイメージで表現しました。値の更新が不可能な場合の返信

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

答えて

1

基本的には何が起こることはある:あなたがerrorBodyを取得し、あなたがそれを解析するGsonを頼む最初if(response.code() == 400)

。だから今はJSONが消えてしまった、それはなくなった。

2番目のif(response.code() == 400)に達すると、もはやJSONがありません。

問題は、なぜerrorBodyを2回解析するのですか?

ちょうど行いますdocumentationから

@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

最初の応答以降、本文はヌルです。そして、これは私のカッシーを運転する。私はそのコードを削除しますが、問題は解決しません。 – learner

+0

エラーが見つかりました。あなたが言ったように、私はそれを2回消費しています。私はデバッグ時にそれを消費しています。それを写真で見てください。 – learner

2

レスポンスボディは一度だけ消費することができます。

あなたはそれを2回消費しています。最初に値を返し、2回目はnullです。

+0

この現象は、最初のresponse.errorBody()以降に発生します。私はコードの部分を削除しますが、問題は残っています。 – learner

+0

@learner 'charStream()'の代わりに 'string()'メソッドを使って本文を読み込めますか? – LordRaydenMK

+1

エラーが見つかりました。あなたが言ったように、私はそれを2回消費しています。私はデバッグ時にそれを消費しています。それを写真で見てください。 – learner

0

エラーを見つけました。回答者のように、私はそれを2回消費していると言いました。私はデバッグ時にそれを消費しています。それを写真で見てください。

関連する問題