【问题标题】:404 - when calling API with Retrofit2 and RXJava2404 - 使用 Retrofit2 和 RXJava2 调用 API 时
【发布时间】:2017-01-24 10:48:25
【问题描述】:

我在使用下面提到的库调用 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<CoreObject> getForumRx(@Path("slugOrUUID") String slugOrUUID);

最后是我调用 REST 的地方

    ForumService forumService = retrofit.create(ForumService.class);

    Observable<CoreObject> photography = forumService.getForumRx("sample");

    photography.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<CoreObject>() {
                @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)

【问题讨论】:

  • 你能分享你打电话的网址吗?它是否在 curl 中返回有效值?
  • 我无法共享 URL,但正如我所提到的,当我不使用 rx 时我没有问题,邮递员对此也没有问题。
  • 包含一个logging interceptor并检查是否调用了正确的url。
  • 投票结束,因为它是无法再重现的问题或由简单的印刷错误引起的问题
  • photography.subscribeOn(Schedulers.io()) 是多余的,你已经用这个调度器创建了 RxJava2CallAdapterFactory。尝试添加gist.github.com/agustinsivoplas/… 了解更多详情。

标签: android retrofit2 rx-android rx-java2


【解决方案1】:

我不清楚,但如果问题不在不同的 HTTP 响应中,而是在不同的行为中(在 Retrofit 2 RxJava 中使用 401 响应而不是 onNext 触发 onError),那么它可以按设计工作。

您需要分析Exception 的类,它来自onError 处理程序。

@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://stackoverflow.com/a/45868252/1824898

【讨论】:

    【解决方案2】:

    我希望这会对某人有所帮助。我浪费了很多时间。玩这个游戏基本上就是HTTPs请求的responseCode。

    请参考:https://stackoverflow.com/a/60630522/6236752

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2017-08-28
      • 2017-11-14
      • 2018-03-09
      • 1970-01-01
      相关资源
      最近更新 更多