我正在使用这些版本;
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。
答案 0 :(得分:3)
返回Observable<Response<T>>
而不是Observable<T>
。 Response<T>
类具有访问有关响应的信息的方法以及访问.body()
的{{1}}方法。
请注意,使用T
时,与直接访问Response<T>
不同,它不会自动将非2xx响应代码转换为异常。如果服务器响应,那么它将始终调用T
。
围绕Retrofit界面创建一个包装器,根据需要转换Observable。例如,将onNext(..)
401映射到错误。