404 – 使用Retrofit2和RXJava2调用API时

我有一个与提到的libs下面调用API的问题

我的依赖:

compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.0.1' 

提供翻新实例的代码

 @Provides @Singleton RxJava2CallAdapterFactory provideRxJavaCallAdapter(){ return RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()); } @Provides @Singleton Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient, RxJava2CallAdapterFactory rxJavaCallAdapterFactory){ return new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(rxJavaCallAdapterFactory) .client(okHttpClient) .build(); } 

Api界面

 @GET("form/{slugOrUUID}") Observable getForumRx(@Path("slugOrUUID") String slugOrUUID); 

最后放到我打电话给REST的地方

  ForumService forumService = retrofit.create(ForumService.class); Observable photography = forumService.getForumRx("sample"); photography.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { Log.i(TAG, "onSubscribe: "); } @Override public void onNext(CoreObject value) { Log.i(TAG, "onNext: "); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: ", e); } @Override public void onComplete() { Log.i(TAG, "onComplete: "); } }); 

结果我得到404 – 没有RxJava调用API没有问题。 有人可以告诉我什么是错的或为什么我得到这样的错误?

 com.jakewharton.retrofit2.adapter.rxjava2.HttpException: HTTP 404 at com.jakewharton.retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:54) at com.jakewharton.retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37) at com.jakewharton.retrofit2.adapter.rxjava2.CallObservable.subscribeActual(CallObservable.java:43) at io.reactivex.Observable.subscribe(Observable.java:10179) at com.jakewharton.retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34) at io.reactivex.Observable.subscribe(Observable.java:10179) at io.reactivex.internal.operators.observable.ObservableSubscribeOn$1.run(ObservableSubscribeOn.java:39) at io.reactivex.Scheduler$1.run(Scheduler.java:134) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:59) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:51) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) 

我不清楚,但如果这个问题不是在不同的HTTP响应,但在不同的行为(获取触发onError 401改进RxJava而不是onNext),那么它按照设计工作。

你需要分析出现在onError处理程序的Exception类。

 @Override public void onError(Throwable e) { if(e instanceof HttpException) { // Cast e to HttpException and do what you need to } else { // This is another exception, like invalid JSON, etc. Log.e(TAG, "onError: ", e); } } 

早些时候,我用简单的kotlin示例和更多的解释在这里回答了几乎相同的问题: https : kotlin