【问题标题】:RxJava2 & Retrofit2 Service class HTTP Response CodeRxJava2 & Retrofit2 服务类 HTTP 响应代码
【发布时间】:2017-03-26 16:19:00
【问题描述】:

我正在使用这些版本;

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 现在支持第一方“adapter-rxjava2”工件。

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

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

【问题讨论】:

  • 请将@Kiskae 回复标记为正确,或者如果您需要了解其他信息,请告诉我们。

标签: android retrofit2 rx-android rx-java2


【解决方案1】:
  • 如何获得类似 Retrofit ResponseBody 类的 Http 响应代码?

通过返回 Observable&lt;Response&lt;T&gt;&gt; 而不是 Observable&lt;T&gt;Response&lt;T&gt; 类具有访问响应信息的方法以及访问 T.body() 方法。

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

  • 我们如何集中 rest api 响应?

围绕 Retrofit 接口创建一个包装器,它可以根据需要转换 Observable。例如将response.code() 401 映射到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2018-03-05
    • 2014-08-09
    • 2016-02-24
    • 2014-08-09
    • 2013-09-12
    相关资源
    最近更新 更多