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