Reputation: 3742
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
Reputation: 25613
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(..)
.
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