2017-01-24 6 views
2

와 API를 호출 할 때 내가 언급 libs와 함께 API를 호출에 문제가404 - Retrofit2 및 RXJava2

내 종속 노호 : 개조 예를

@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를 제공

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' 

코드 인터페이스

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

그리고 임 (404)를 받고 그 결과 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: "); 
       } 
      }); 

전화 드렸습니다 경우 마지막 장소 - 나는 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) 
+0

당신이 전화하고있는 URL을 공유 할 수 있습니다

@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 예를 더 설명과 거의 같은 질문을 answerd? 곱슬 곱슬로 유효한 값을 반환합니까? – ditn

+0

URL을 공유 할 수 없지만 내가 언급 한 것처럼 rx를 사용하지 않을 때는 문제가 없으며 우편 배달부에는 문제가 없습니다. – Robert

+0

[logging interceptor] (https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor)를 포함하고 올바른 URL이 호출되는지 확인하십시오. – nhaarman

답변

0

그것은 나를 위해 명확하지 않다,하지만 문제는 다른 HTTP의 rsponses에없는,하지만 서로 다른 행동을 (대신 onNext의 개조 2 RxJava 401 응답의 OnError 트리거하기) 경우, 다음은 설계된대로 작동 .

Exception의 클래스를 분석해야합니다. 이는 onError 처리기가됩니다. https://stackoverflow.com/a/45868252/1824898