code

Retrofit 2.0 및 RxJava를 사용하여 응답 상태 코드 가져 오기

codestyles 2020. 8. 21. 07:46
반응형

Retrofit 2.0 및 RxJava를 사용하여 응답 상태 코드 가져 오기


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...


Inside onError method put to this get the code

((HttpException) e).code()

You should note that as of Retrofit2 all responses with code 2xx will be called from onNext() callback and the rest of HTTP codes like 4xx, 5xx will be called on the onError() callback, using Kotlin I've came up with something like this in the 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))
  }

참고URL : https://stackoverflow.com/questions/33774940/get-response-status-code-using-retrofit-2-0-and-rxjava

반응형