রেট্রোফিট ২.০ এবং আরএক্সজাভা ব্যবহার করে প্রতিক্রিয়া স্থিতি কোড পান


107

আমি আমার অ্যান্ড্রয়েড প্রকল্পে রেট্রোফিট ২.০ এ আপগ্রেড করতে এবং আরএক্সজেভা যুক্ত করার চেষ্টা করছি। আমি একটি এপিআই কল করছি এবং সার্ভারের ত্রুটির প্রতিক্রিয়ার ক্ষেত্রে ত্রুটি কোডটি পুনরুদ্ধার করতে চাই।

Observable<MyResponseObject> apiCall(@Body body);

এবং আরএক্সজাভা কলটিতে:

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()

আরএক্সজেভা ব্যবহার করে আপনি কীভাবে retrofit 2.0 ব্যবহার করবেন?

উত্তর:


185

আপনার মতো এপিআই কল ঘোষণা করার পরিবর্তে:

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...


16
এইচটিটিপি কোড 4XX-এর সন্ধানকারী লোকদের জন্য তারা অনিয়রে HttpException হিসাবে শেষ হবে। অনেক্সটটিতে কেবল 2XX থাকবে।
ই-নুরি

2
এটি আকর্ষণীয় ... আমি কেবল আবার পরীক্ষা করেছি ( gist.github.com/DavidMihola/17a6ea373b9312fb723b ) এবং onNext404 ইত্যাদি সহ আমি যে সমস্ত কোডগুলি শেষ করার চেষ্টা করেছি সেগুলিতে আমি retrofit v2.0.0-beta3 ব্যবহার করেছি।
ডেভিড.মিহোলা

@ ই-নুরি: আমি আমার উত্তরে মাত্র একটি অনুচ্ছেদ যুক্ত করেছি যা আপনার মন্তব্যকে বিবেচনায় নিয়েছে!
ডেভিড.মিহোলা

1
@ ডেভিড.মিহোলা যদি অ্যাডের মাধ্যমে রেট্রোফিট তৈরি করেন GsonConverterFactory, ঠিক তেমন Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create())কীভাবে আসল প্রতিক্রিয়া পাবেন?
হংহে.উউ

1
ত্রুটি সামলানো ছাড়াও আমি মনে করি আপনি শরীরের সাথে যে কোনও প্রতিক্রিয়া শিরোনামগুলি পরীক্ষা করতে সক্ষম হতে পারেন - এটি কেবল তখনই সম্ভব যদি আপনি তা পান Response। আমি খুব কমই এটি ব্যবহার করি - তবে আমি মনে করি এটি বিদ্যমান কিনা তা জেনে রাখা ভাল।
ডেভিড.মিহোলা

112

অনারার পদ্ধতিটির অভ্যন্তরে কোডটি পেতে এটি রাখুন

((HttpException) e).code()

7
এটি এসওতে আমি দেখেছি এমন একটি সবচেয়ে আন্ডাররেটেড উত্তর হতে পারে। এটি প্রতিভা। প্রতিক্রিয়াটির সাথে আপনার যা যা করার প্রয়োজন হতে পারে তা আপনি করতে পারেন HttpException। আমি আরএক্সজাভা ব্যবহার করছি এবং একটি পাওয়ার পরে আমার প্রতিক্রিয়াটি পার্স করা দরকার HTTP 400 BAD REQUEST। আপনাকে অনেক ধন্যবাদ!
গ্যাব্রিয়েল ওশিরো

29
কেবল এটি নিশ্চিত করে নিন যে এটি আগে এইচটিটিপিএক্সসেপ্টের উদাহরণস্বরূপ কিনা কারণ নেটওয়ার্কএরফারস আইওএক্সেপশন হবে এবং স্ট্যাটাস কোড নেই।
বেনিয়ামিন মেসিং

@ বেনজমিনমিসিং থেকে অনুসরণ করতে নেটওয়ার্কআরার সম্পর্কে বলা হয়েছে, আপনি সাবস্ক্রাইব করার আগে আপনি যদি আপনার আরএক্সে আরও ডাউনস্ট্রিম অপারেটরগুলি (ম্যাপ / ফ্ল্যাটম্যাপ / ফোরইচ ইত্যাদি ..) করছেন তবে সম্ভাব্য ব্যতিক্রমধর্মী একটি হোস্ট থাকতে পারে এবং অগত্যা কোনও ত্রুটি নয় নেটওয়ার্ক অনুরোধ।
মার্ক কেইন

java.lang.ClassCastException: java.lang.Throwable retrofit2.HttpException কাস্ট করা যাবে না
কেউ কোথাও

7

আপনি সচেতন থাকা আবশ্যক হিসাবে যে Retrofit2 কোড সহ সমস্ত প্রতিক্রিয়া 2xx onNext () কলব্যাক এবং বাকি থেকে ডাকা হবে HTTP- র কোডের 4xx মতো 5xx উপর বলা হবে onError () , কলব্যাক ব্যবহার Kotlin আমি মত কিছু নিয়ে এসেছেন এটি অনারারে () :

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))
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.