আপনার মতো এপিআই কল ঘোষণা করার পরিবর্তে:
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...