अपने जैसे एपीआई कॉल की घोषणा करने के बजाय:
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
संपादित करें: ठीक है, मैं अंत में ई-नूरी ने अपनी टिप्पणी में कहा है कि केवल 2xx कोड करने के लिए होगा onNext
। हम दोनों सही हैं:
यदि कॉल इस तरह से घोषित किया जाता है:
Observable<Response<MyResponseObject>> apiCall(@Body body);
या यह भी
Observable<Response<ResponseBody>> apiCall(@Body body);
सभी प्रतिक्रियाएँ समाप्त हो जाएंगी onNext
, चाहे उनका त्रुटि कोड कुछ भी हो। यह संभव है क्योंकि Response
रिट्रोफिट द्वारा एक वस्तु में सब कुछ लपेटा गया है ।
यदि, दूसरी ओर, कॉल इस तरह घोषित की जाती है:
Observable<MyResponseObject> apiCall(@Body body);
या यह
Observable<ResponseBody> apiCall(@Body body);
वास्तव में केवल 2xx प्रतिक्रियाएं ही जाएंगी onNext
। बाकी सब कुछ एक में लपेटा जाएगा HttpException
और भेजा जाएगा onError
। जो भी समझ में आता है, क्योंकि Response
आवरण के बिना , क्या उत्सर्जित किया जाना चाहिएonNext
? यह देखते हुए कि अनुरोध सफल नहीं था केवल समझदार चीज ही नहीं होगी null
...