okarakose
okarakose

Reputation: 3742

RxJava2 & Retrofit2 Service class HTTP Response Code

I am using these versions ;

compile "com.squareup.retrofit2:retrofit:2.2.0"
compile "com.squareup.retrofit2:converter-gson:2.2.0"
compile "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0"
compile "io.reactivex.rxjava2:rxjava:2.0.6"
compile "io.reactivex.rxjava2:rxandroid:2.0.1"

ApiService

import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.POST;

public interface ApiService {

    @POST("authenticate")
    Observable<SignInResponse> auth(@Body SignInRequest request);

    @POST("user/signUp")
    Observable<SignUpResponse> signUp(@Body SignUpRequest request);

    @POST("restricted/event/addEvent")
    Observable<NewEventResponse> createEvent(@Body NewEventRequest request);
}

ApiClient

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import io.reactivex.Observable;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {

    private static ApiClient apiClient;
    private final ApiService apiService;

    public static ApiClient getInstance() {
        if (apiClient == null)
            apiClient = new ApiClient();
        return apiClient;
    }

    private ApiClient() {
        OkHttpClient client = new OkHttpClient.Builder()
            .build();

        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
        apiService = retrofit.create(ApiService.class);
    }

    public Observable<SignInResponse> authenticate(SignInRequest request) {
        return apiService.auth(request);
    }

    public Observable<SignUpResponse> signUp(SignUpRequest request) {
        return apiService.signUp(request);
    }

    public Observable<NewEventResponse> createEvent(NewEventRequest request) {
        return apiService.createEvent(request);
    }
}

SignInPresenter

import com.okarakose.commons.mvp.presenter.BasePresenter;

import hugo.weaving.DebugLog;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;

public class SignInPresenter extends BasePresenter<SignInView> {

    private final DataManager dataManager;
    private final CompositeDisposable disposables;

    public SignInPresenter() {
        dataManager = DataManager.getInstance();
        disposables = new CompositeDisposable();
    }

    public void signIn(String mailAddress, String password) {
        getMvpView().showProgress();

        mailAddress = mailAddress.trim();
        password = password.trim();

        SignInRequest signInRequest = new SignInRequest.Builder(mailAddress, password)
            .build();

        disposables.add(ApiClient.getInstance().authenticate(signInRequest)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(response -> {
                getMvpView().hideProgress();

                if (response.success == 1) {
                    dataManager.getPreferencesHelper().putToken(response.token);
                    dataManager.getPreferencesHelper().putUser(response.data);
                    getMvpView().loginSuccess();
                } else {
                    getMvpView().loginFailed(response.messages.get(0));
                    dataManager.getPreferencesHelper().clearUser();
                }

            }, throwable -> {
                throwable.printStackTrace();
                getMvpView().hideProgress();
            }));
    }
}

Retrofit2 CHANGELOG https://github.com/square/retrofit/blob/master/CHANGELOG.md

RxJava 2.x is now supported with a first-party 'adapter-rxjava2' artifact.

My question is : How can I get Http response code like Retrofit ResponseBody class ?

Another question is : How can we centralize rest api responses ? for example if api returns http response code 401, then throw AuthenticationException or success flag returns 0, then throw GenericException.

Upvotes: 1

Views: 1177

Answers (1)

Kiskae
Kiskae

Reputation: 25613

  • How can I get Http response code like Retrofit ResponseBody class ?

By returning Observable<Response<T>> instead of Observable<T>. The Response<T> class has methods to access information about the response as well as the .body() method to access T.

Do note that when using Response<T> it will not automatically turn non-2xx response codes into exceptions unlike directly accessing T. If the server responds then it will have always call onNext(..).

  • How can we centralize rest api responses ?

Create a wrapper around the Retrofit interface which transforms the Observable as you required. For example mapping response.code() 401 to an Error.

Upvotes: 3

Related Questions