RxJava2& Retrofit2服务类HTTP响应代码

时间:2017-03-26 16:19:00

标签: android retrofit2 rx-android rx-java2

我正在使用这些版本;

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现在支持第一方&#39; adapter-rxjava2&#39;工件。

我的问题是:如何获得像Retrofit ResponseBody类这样的Http响应代码?

另一个问题是:我们如何集中休息api响应?例如,如果api返回http响应代码401,则抛出AuthenticationException或success标志返回0,然后抛出GenericException。

1 个答案:

答案 0 :(得分:3)

  • 如何获得Http响应代码,如Retrofit ResponseBody类?

返回Observable<Response<T>>而不是Observable<T>Response<T>类具有访问有关响应的信息的方法以及访问.body()的{​​{1}}方法。

请注意,使用T时,与直接访问Response<T>不同,它不会自动将非2xx响应代码转换为异常。如果服务器响应,那么它将始终调用T

  • 我们如何集中休息api响应?

围绕Retrofit界面创建一个包装器,根据需要转换Observable。例如,将onNext(..) 401映射到错误。