404 - при вызове API с Retrofit2 и RXJava2

У меня проблема с вызовом 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 - нет проблем, когда я вызываю API без RxJava. Кто-нибудь может сказать мне, что не так или почему я получаю такую ​​ошибку?

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)

person Robert    schedule 24.01.2017    source источник
comment
Можете ли вы поделиться URL-адресом, по которому вы звоните? Возвращает ли он действительное значение в curl?   -  person ditn    schedule 24.01.2017
comment
Я не могу поделиться URL-адресом, но, как я уже упоминал, у меня нет проблем, когда я не использую для этого rx, и у Почтальона нет проблем с этим.   -  person Robert    schedule 24.01.2017
comment
Включите перехватчик ведения журнала и проверьте, вызывается ли правильный URL. .   -  person nhaarman    schedule 24.01.2017
comment
Голосование за закрытие, так как это проблема, которая больше не может быть воспроизведена или вызвана простой типографской ошибкой.   -  person nhaarman    schedule 24.01.2017
comment
photography.subscribeOn(Schedulers.io()) является избыточным, вы создали RxJava2CallAdapterFactory с помощью этого планировщика. Попробуйте добавить gist.github.com/agustinsivoplas/ для получения дополнительной информации.   -  person AndroidRuntimeException    schedule 24.01.2017
comment
Проблема еще актуальна? Вы жалуетесь на Exception, или проблема была в том, что без RxJava вы получали 2xx HTTP-ответ, а с RxJava — 401 HTTP-ответ? Я отправил ответ, и если это не ваш случай, пожалуйста, дайте мне знать.   -  person Клаус Шварц    schedule 24.08.2017


Ответы (2)


Для меня непонятно, но если проблема не в разных ответах HTTP, а в другом поведении (срабатывание onError с ответом 401 в Retrofit 2 RxJava вместо onNext), то это работает как задумано.

Вам нужно проанализировать класс 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 и дополнительных объяснений здесь: /а>

person Клаус Шварц    schedule 24.08.2017

Я надеюсь, что это поможет кому-то. Я потратил много времени. В основном это был responseCode HTTP-запроса, который играл в эту игру.

Обратитесь к этому: https://stackoverflow.com/a/60630522/6236752

person Nouman Ch    schedule 11.03.2020