আমি কীভাবে retrofit 2 এর সাথে খালি প্রতিক্রিয়া বডি হ্যান্ডেল করতে পারি?


125

সম্প্রতি আমি রেট্রোফিট 2 ব্যবহার শুরু করেছি এবং খালি প্রতিক্রিয়া বডিকে বিশ্লেষণ করে আমি একটি সমস্যার মুখোমুখি হয়েছি। আমার এমন একটি সার্ভার রয়েছে যা প্রতিক্রিয়া বডির কোনও সামগ্রী ছাড়াই কেবল HTTP কোড দিয়ে সাড়া দেয়।

আমি কীভাবে সার্ভারের প্রতিক্রিয়া (শিরোনাম, স্থিতি কোড ইত্যাদি) সম্পর্কে কেবল মেটা তথ্য পরিচালনা করতে পারি?

উত্তর:


216

সম্পাদনা:

জ্যাক ওয়ার্টন যেমন উল্লেখ করেছেন,

@GET("/path/to/get")
Call<Void> getMyData(/* your args here */);

আমার আসল প্রতিক্রিয়াটির তুলনায় সবচেয়ে ভাল উপায় -

আপনি কেবলমাত্র ফিরে আসতে পারেন ResponseBody, যা প্রতিক্রিয়াটিকে পার্সিং করে বাইপাস করবে।

@GET("/path/to/get")
Call<ResponseBody> getMyData(/* your args here */);

তারপরে আপনার কলে

Call<ResponseBody> dataCall = myApi.getMyData();
dataCall.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        // use response.code, response.headers, etc.
    }

    @Override
    public void onFailure(Throwable t) {
        // handle failure
    }
});

58
আরও ভাল: ব্যবহার করুন Voidযা কেবলমাত্র ভাল শব্দার্থবিজ্ঞানই নয় তবে খালি ক্ষেত্রে (সামান্য) আরও দক্ষ এবং একটি খালি নয় ক্ষেত্রে (যখন আপনি কেবল দেহের যত্ন নেবেন না) ক্ষেত্রে আরও বেশি দক্ষ।
জ্যাক ওয়ার্টন

1
@ জ্যাকওয়ার্টন এটি দুর্দান্ত আচরণ। এটি নির্দেশ করার জন্য ধন্যবাদ। উত্তর আপডেট হয়েছে।
আইলগ্রিন

2
দুর্দান্ত উত্তর। অকার্যকর ব্যবহার না করার একটি কারণ হ'ল যদি আপনার কাছে এমন কোনও সংস্থান থাকে যা কেবলমাত্র অনুরোধটি ব্যর্থ হয় এবং আপনি ত্রুটি-বডি রেসপন্সবডিটিকে কিছু নির্দিষ্ট বা সাধারণ ধরণের রূপান্তর করতে চান a

7
@ জ্যাকওয়ার্টন ব্যবহারের জন্য দুর্দান্ত পরামর্শ VoidUnitকোটলিন কোড ব্যবহার করে কি রেট্রোফিটের Voidজন্য জাভাতে একই সুবিধা দিতে পারে ?
অক্ষয় চর্দিয়া

6
@ অক্ষয়-চর্দিয়া আমি স্রেফ দেখেছি, কোটলিনে Unitকাজ করে না, Voidতা হয় না । আমি ধরে নিই যে কোথাও একটি হার্ডকোডযুক্ত চেক আছে।
ব্যবহারকারী 3363866

40

আপনি যদি আরএক্সজাভা ব্যবহার Completableকরেন তবে এই ক্ষেত্রে ব্যবহার করা ভাল

কোনও মান ছাড়াই মুলতুবিযুক্ত গণনা উপস্থাপন করে তবে সম্পূর্ণ বা ব্যতিক্রমের জন্য কেবল ইঙ্গিত। ক্লাসটি প্রতিক্রিয়াশীল-স্ট্রিম হিসাবে একই ইভেন্ট প্যাটার্নটিকে অনুসরণ করে: onSubscribe (onError | onComplete)?

http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html

গৃহীত উত্তরে:

@GET("/path/to/get")
Observable<Response<Void>> getMyData(/* your args here */);

যদি শেষ পয়েন্ট ব্যর্থতার প্রতিক্রিয়া কোডটি দেয়, তবে এটি পরে থাকবে onNext এবং আপনাকে প্রতিক্রিয়া কোডটি নিজেই পরীক্ষা করতে হবে।

তবে, যদি আপনি ব্যবহার Completable

@GET("/path/to/get")
Completable getMyData(/* your args here */);

আপনার কেবল onCompleteএবং থাকবে onError। প্রতিক্রিয়া কোডটি যদি সাফল্য হয় তবে তা আগুন ধরিয়ে দেবে onCompleteঅন্যথায় তা আগুন ধরিয়ে দেবে onError


1
onError Throwableএই ক্ষেত্রে যুক্তিটি কী ধারণ করবে ? আমি এই ক্লিনারটি খুঁজে পাই, তবে আমাদের প্রায়শই ব্যর্থতার জন্য প্রতিক্রিয়া কোড এবং বডিটি দেখার প্রয়োজন।
বড়_মিনি

24

আপনি যদি rxjava ব্যবহার করছেন তবে এর মতো কিছু ব্যবহার করুন:

@GET("/path/to/get")
Observable<Response<Void>> getMyData(/* your args here */);

আমি যে সন্ধান করছিলাম! ধন্যবাদ!
সাইরেলন

আমি আরপিএস জাভা 2 এবং রেট্রোফিট 2-এর সাথে রেসপোডোডি ব্যবহার করেছি PST REST অনুরোধের জন্য। এটি দুর্দান্ত কাজ করেছে
মতি বার্তভ

1
আমাদের একটি এন্ডপয়েন্ট পয়েন্ট এপিআই রয়েছে যা সাফল্যের সময় খালি দেহ এবং ত্রুটি হলে জসন বডি ফেরত দেয়। রেসপন্স <অবধি> ব্যবহার করা থাকলে আমি কীভাবে ত্রুটি কেস পরিচালনা করতে পারি?
কেএনভিন ফ্যাভো

আপনি এখানে কোন প্রতিক্রিয়া শ্রেণি ব্যবহার করেন? রিট্রোফিটস বা ওকে এইচটিটিপিএস?
ম্যাথিয়াস

1
যদি আপনি ব্যতিক্রমগুলি পরিচালনা করতে ত্রুটি পরিচালনা করেন তবে এটি কোনও ভাল বিকল্প নয় .. আপনি এই পদ্ধতির সাথে কোনও আপত্তি পাবেন না, বরং ত্রুটির প্রতিক্রিয়া হিসাবে একটি জেএসওএন
ওভি ত্রিফ

0

এখানে আমি এটি কীভাবে আরএক্স 2 এবং রেট্রোফিট 2 দিয়ে পুট রেস্ট অনুরোধের সাথে ব্যবহার করেছি: আমার অনুরোধটিতে একটি জসন বডি ছিল তবে খালি শরীরের সাথে কেবল এইচটিসিপি প্রতিক্রিয়া কোড ছিল।

এপিআই ক্লায়েন্ট:

public class ApiClient {
public static final String TAG = ApiClient.class.getSimpleName();


private DevicesEndpoint apiEndpointInterface;

public DevicesEndpoint getApiService() {


    Gson gson = new GsonBuilder()
            .setLenient()
            .create();


    OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    okHttpClientBuilder.addInterceptor(logging);

    OkHttpClient okHttpClient = okHttpClientBuilder.build();

    apiEndpointInterface = new Retrofit.Builder()
            .baseUrl(ApiContract.DEVICES_REST_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
            .create(DevicesEndpoint.class);

    return apiEndpointInterface;

}

ইন্টারফেস:

public interface DevicesEndpoint {
 @Headers("Content-Type: application/json")
 @PUT(ApiContract.DEVICES_ENDPOINT)
 Observable<ResponseBody> sendDeviceDetails(@Body Device device);
}

তারপরে এটি ব্যবহার করতে:

    private void sendDeviceId(Device device){

    ApiClient client = new ApiClient();
    DevicesEndpoint apiService = client.getApiService();
    Observable<ResponseBody> call = apiService.sendDeviceDetails(device);

    Log.i(TAG, "sendDeviceId: about to send device ID");
    call.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() {
        @Override
        public void onSubscribe(Disposable disposable) {
        }

        @Override
        public void onNext(ResponseBody body) {
            Log.i(TAG, "onNext");
        }

        @Override
        public void onError(Throwable t) {
            Log.e(TAG, "onError: ", t);

        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onCompleted: sent device ID done");
        }
    });

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