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
오류 코드에 관계없이로 끝납니다 . 모든 것이 Response
Retrofit에 의해 개체에 싸여 있기 때문에 가능합니다 .
반면에 호출이 다음과 같이 선언되면 :
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))
}