2017-11-06 14 views
1

RxJava를 개장 한 상태에서 사용하고 있습니다. 나는 그것이 실패하거나 성공했을 때 요청에 의해 보내진 BODY/RAW를 어떻게 찾을 수 있는지 알고 싶다.추가 요청이 실패했을 때 갱신 요청 본문을 얻는 방법은 무엇입니까?

이것은 API 호출 내 컨트롤러 :

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

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

을 그리고 이러한 대답을받을 수있는 방법은 다음과 같습니다

나는 내가 사용하는 ChatMessage 클래스를 얻을 수있는 방법을 알고 싶어요
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  
} 

요청하십시오. 실패에

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

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

답변

1

형제가 더 몸에 존재하지 않는 :

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

이이 API를 호출하는 내 컨트롤러 : 그냥 참조

에 대한

이 내 인터페이스 응답. 오류가있는 코드가 있습니다. 404 등. 하지만 실패한 서버 응답에 대해 이야기하고 있다면. Retrofit을 통해 앱에 로그인 할 때처럼. 잘못된 자격 증명을 입력하면 인터넷 및 서버와의 연결이 모두 정상입니다. 그렇더라도 응답은 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 위의 대답에서 업데이트를 참조하십시오. –