1

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.

1
  • Please mark @Kiskae reply as correct or tell us if you need to know something else. Commented Aug 24, 2017 at 18:39

1 Answer 1

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.