Retrofit 2.0 및 RxJava를 사용하여 응답 상태 코드 가져 오기 apiCall(@Body body); 그리고 RxJava 호출에서 : myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {

Retrofit 2.0으로 업그레이드하고 Android 프로젝트에 RxJava를 추가하려고합니다. API 호출을하고 있으며 서버에서 오류 응답이 발생하는 경우 오류 코드를 검색하고 싶습니다.

Observable<MyResponseObject> apiCall(@Body body);

그리고 RxJava 호출에서 :

myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(MyResponseObject myResponseObject) {
           //On response from server
        }
    });

Retrofit 1.9에서 RetrofitError는 여전히 존재하며 다음을 수행하여 상태를 얻을 수 있습니다.

error.getResponse().getStatus()

RxJava를 사용하여 Retrofit 2.0으로 어떻게 수행합니까?



답변

다음과 같이 API 호출을 선언하는 대신 :

Observable<MyResponseObject> apiCall(@Body body);

다음과 같이 선언 할 수도 있습니다.

Observable<Response<MyResponseObject>> apiCall(@Body body);

그러면 다음과 같은 구독자가 생깁니다.

new Subscriber<Response<StartupResponse>>() {
    @Override
    public void onCompleted() {}

    @Override
    public void onError(Throwable e) {
        Timber.e(e, "onError: %", e.toString());

        // network errors, e. g. UnknownHostException, will end up here
    }

    @Override
    public void onNext(Response<StartupResponse> startupResponseResponse) {
        Timber.d("onNext: %s", startupResponseResponse.code());

        // HTTP errors, e. g. 404, will end up here!
    }
}

따라서 오류 코드가 포함 된 서버 응답도로 전달되며을 onNext호출하여 코드를 가져올 수 있습니다 reponse.code().

http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html

편집 : 좋아, 마침내 e-nouri가 자신의 의견에서 말한 내용, 즉 2xx 코드 만 onNext. 우리 둘 다 옳다는 것이 밝혀졌습니다.

호출이 다음과 같이 선언 된 경우 :

Observable<Response<MyResponseObject>> apiCall(@Body body);

또는 이것도

Observable<Response<ResponseBody>> apiCall(@Body body);

모든 응답은 onNext오류 코드에 관계없이로 끝납니다 . 모든 것이 ResponseRetrofit에 의해 개체에 싸여 있기 때문에 가능합니다 .

반면에 호출이 다음과 같이 선언되면 :

Observable<MyResponseObject> apiCall(@Body body);

아니면 이거

Observable<ResponseBody> apiCall(@Body body);

실제로 2xx 응답 만 onNext. 다른 모든 것은로 포장되어로 HttpException전송됩니다 onError. Response래퍼가 없으면 무엇 방출해야 onNext하나요? 요청이 성공적이지 않았다는 점을 감안할 때 방출 할 수있는 유일한 것은 null


답변

onError 메소드 내부에 코드를 가져 오기 위해 이것을 넣으십시오.

((HttpException) e).code()

답변

당신의 같은 점에 유의해야한다 Retrofit2 코드와 모든 응답 가 2xx이 onNext () 콜백와의 나머지 부분에서 호출되는 HTTP 코드 4XX 같은, 5XX가 호출됩니다 의 OnError () 사용하여 콜백 코 틀린 I의 한 같은 것을 함께했다 이것은 onError () :

mViewReference?.get()?.onMediaFetchFinished(downloadArg)
  if (it is HttpException) {
    val errorCode = it.code()
    mViewReference?.get()?.onMediaFetchFailed(downloadArg,when(errorCode){
      HttpURLConnection.HTTP_NOT_FOUND -> R.string.check_is_private
      else -> ErrorHandler.parseError(it)
    })
  } else {
    mViewReference?.get()?.onMediaFetchFailed(downloadArg, ErrorHandler.parseError(it))
  }