2017-11-06 4 views
1

RxJavaを改造して使用しています。私は、失敗または成功したときに要求によって送信されたBODY/RAWをどのように取り出すことができるか知りたい。改造要求が失敗した場合、改造要求の本体を取得するにはどうすればよいですか?

これは、APIを呼び出す私のコントローラである:

ChatMessage body = new ChatMessage(); 
    ... 
    //configuration of body variable is omitted. 
    ... 

chatController.sendMessage(body).subscribe(this::onSendMessageSuccess, this::onSendMessageError); 

そして、これらの答えを受け取るためのメソッドです:

private void onSendMessageSuccess(ChatRestResponse response) { 
    // How can I get the "ChatMessage body" sent in at first by the re 
} 

private void onSendMessageError(Throwable throwable) { 
    // How can I get the "ChatMessage body" sent in at first by the request  
} 

私は私が使用ChatMessageクラスを得ることができる方法を知りたいです要求をする。

はJUST REFERENCES

については、これは私のインターフェイスです:

@Headers({ 
    "Accept: application/json", 
    "Content-Type: application/json" 
}) 
@POST(URL) 
Observable<ChatRestResponse> sendMessage(
    @Header("Authorization") String token, 
    @Body ChatMessage body); 

これは、APIを呼び出す私のコントローラである:

public Observable<ChatRestResponse> sendMessage(ChatMessage body) { 
    String accessToken = mPref.getAccesToken(); 

    return mChatApi.sendMessage(accessToken , body) 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()); 
} 

答えて

1

ブラザーの失敗には体が中に存在していないがあります応答。それが直面するエラーに関連するコードがいくつかあります。 404などのように。 あなた自身のサーバーの応答については、失敗している話している場合。あなたがRet​​rofitによってあなたのアプリからアカウントにログインした場合のように。あなたが間違った資格情報を入力すると、インターネットとサーバーとの接続はすべてOKです。それでも応答は機能onResponce()を実行します。しかしここでは、サーバーがタイプまたはエラーに関連付けて送信するサーバーの内部エラーを確認できます。

call.enqueue(new Callback<LoginResponse>() { 
        @Override 
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
         if (response.code == HttpURLConnection.HTTP_OK) { 
          //All is well 
          // you can get body here as 
          String token = responce.body().getToken(); 
          //etc 
         } else { 
          //Something went wrong like password etc 
          //You can check the body here also in case of failure 
          //Which is due to some internal server error 
          //because of wrong credentials 
          //But this response is in failure and also have a body 
          //I guess this is what u want 
          String failuerToken = responce.getBody().getAccessToken(); 
          new AlertDialog.Builder(LoginActivity.this) 
            .setMessage("Invalid Credentials") 
            .setCancelable(false) 
            .setPositiveButton("Try Again", null) 
            .show(); 
         } 
        } 

        @Override 
        public void onFailure(Call call, Throwable t) { 
         showProgress(false); 

         new AlertDialog.Builder(LoginActivity.this) 
           .setMessage("Unable to reach server") 
           .setCancelable(false) 
           .setPositiveButton("Try Again", null) 
           .show(); 
         call.cancel(); 
        } 
       }); 

LoginResponse 

は自分のクラスであることに注意してください

public class LoginResponse { 
    @SerializedName("access_token") 
    @Expose 
    public String accessToken; 
    @SerializedName("token_type") 
    @Expose 
    public String tokenType; 
    @SerializedName("expires_in") 
    @Expose 
    public Integer expiresIn; 
} 

UPDATE

Call<LoginResponse> call = apiInterface.Login(requestData); 

私はrequestDataを使用してデータを送信していますを参照してください。あなたの問題に対する唯一の解決策は、別のパッケージ名をurilsにして、クラスRequestDataを作り、いくつかの静的変数を入れてください。

public class RequestData { 
    public static String username; 
    public static String password; 
    public static String email; 
    public static Int age; 
    //etc 
} 

はその後 api callを介してデータを送信する。この

RequestData.username = "abcd"; 
RequestData.password = "abcd"; 
RequestData.email = "[email protected]"; 
RequestData.age = 20"; 

のような変数の値を設定してください。

このクラスを使用して失敗した場合は、このクラスを使用して前のデータにアクセスし、それぞれのUIに表示します。

+0

@Deneb Chornyこれは完璧な答えです..失敗した場合、応答にボディが存在しないので、コールバックのonFailureメソッドを使用する必要があります。 –

+0

答えは素晴らしいです、私はすでにこれについて知っていて、答えることに感謝します。しかし、私はインターセプタを作る方法がないのだろうか?というのは。私は生まれて/ボディとして送信されたオブジェクトを得ることができるようにエラーや成功がある場合、それが欲しいです。 なぜですか?リクエストを作成する正確なオブジェクトのUIを更新したいからです。私は解決策があることを願っています –

+0

@DenebChorny上記の答えの更新を参照してください –

関連する問題