HTTP 401 - пустой обзор повторного использования с RxJava2 и Retrofit2 в шаблонах MVVM - PullRequest
0 голосов
/ 22 ноября 2018

Я довольно новичок в шаблонах MVVM и вызове API с RxJava2 и Retrofit2 .Я пытаюсь вызвать API из Unsplash API Я понятия не имею, что мне делать, я просмотрел много учебников, но не нашел решения, что происходит.

Здесь я предоставляю APIService и OkHttpClient и Модернизация:

 @Provides
@Singleton
fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
    val interceptor = HttpLoggingInterceptor()
    interceptor.level = HttpLoggingInterceptor.Level.BODY
    return interceptor
}

@Provides
@Singleton
fun provideOkHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
    val okHttpClient = OkHttpClient.Builder()
    okHttpClient.apply {
        if (BuildConfig.DEBUG) {
            addNetworkInterceptor(StethoInterceptor())
            addInterceptor(httpLoggingInterceptor)
        }
    }
    return okHttpClient.build()
}

    @Provides
@Singleton
fun provideApiService(okHttpClient: OkHttpClient): PhotoService {
    val retrofit = Retrofit.Builder()
        .baseUrl("https://api.unsplash.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .client(okHttpClient)
        .build()

    return retrofit.create(PhotoService::class.java)
}

PhotoService:

   @GET("photos")
fun getPhotos(@Query("page") page: Int = 1): Observable<List<Photo>>

PhotoRepository:

  fun getPhotos() : PhotoService {
    return photoApiService
}

ViewModel:

  //=======================================================
//                  DISPOSABLE
//=======================================================
private var disposable: Disposable? = null


//=======================================================
//         GET PHOTOS
//=======================================================
private val photoLive = MutableLiveData<List<Photo>>()
private val photoData: LiveData<List<Photo>>
get() = photoLive

@SuppressLint("LogNotTimber", "CheckResult")
fun getPhotos(): LiveData<List<Photo>> {
   disposable = photoRepository.getPhotos().getPhotos()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
       {
               it -> photoLive.value = it
       },
       {
               it -> if (it != null)
       {
               Log.e(TAG,Log.getStackTraceString(it))
       }
       })
    return photoData
}

И Фрагмент где я устанавливаю адаптер:

 private fun setPhotos() {
    viewModel.getPhotos().observe(this, Observer<List<Photo>> {
        it -> rvListPhoto.adapter = PhotosAdapter(it)
    })
}

Я думаю, что код из Адаптер не обязательно ставить его.Потому что ошибка с другой стороны, но я не знаю, где проблема.

И если это имеет значение, вот ошибка:

retrofit2.adapter.rxjava2.HttpException: HTTP 401 
    at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:54)
    at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
    at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:44)
    at io.reactivex.Observable.subscribe(Observable.java:12005)
    at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
    at io.reactivex.Observable.subscribe(Observable.java:12005)
    at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
    at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:571)
    at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
    at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)

1 Ответ

0 голосов
/ 22 ноября 2018

Глядя на документацию unsplash, кажется, что вам нужно передать client_id с вашим запросом в качестве параметра запроса, как показано ниже

https://api.unsplash.com/photos/?client_id=YOUR_ACCESS_KEY

Это client_id можно найти с помощью API аутентификации пользователя в https://unsplash.com/oauth/

Проверьте https://unsplash.com/documentation#user-authentication для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...