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
오류 코드에 관계없이로 끝납니다 . 모든 것이 Response
Retrofit에 의해 개체에 싸여 있기 때문에 가능합니다 .
반면에 호출이 다음과 같이 선언되면 :
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
'code' 카테고리의 다른 글
ExecuteScalar, ExecuteReader 및 ExecuteNonQuery의 차이점은 무엇입니까? (0) | 2020.08.21 |
---|---|
MySQL 덤프에서 DEFINER 절 제거 (0) | 2020.08.21 |
Symfony 2 : 사용자가 템플릿 내에 로그인되어 있지 않은지 어떻게 확인합니까? (0) | 2020.08.21 |
windows.h가 포함되어 있는데 std :: min이 실패하는 이유는 무엇입니까? (0) | 2020.08.21 |
Python 반복기에서 마지막 항목을 가져 오는 가장 깨끗한 방법 (0) | 2020.08.21 |