Как разобрать успешный ответ тела на HTTP-исключении 401? - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь проанализировать фактическое тело ответа, даже если сервер возвращает 401 HTTP Exception.

protected inline fun <RESPONSE : ParentResponse> executeNetworkCall(
        crossinline request: () -> Single<RESPONSE>,
        crossinline successful: (t: RESPONSE) -> Unit,
        crossinline error: (t: RESPONSE) -> Unit) {

    request().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    { t: RESPONSE ->
                        errorHandler!!.checkApiResponseError(t)?.let {
                            listener?.onErrorWithId(t.message!!)
                            error(t)
                            return@subscribe
                        }
                        successful(t)
                    }
                    ,
                    { t: Throwable ->
                        listener?.onErrorWithId(t.message!!)
                    }
            )
}

Это то, что я написал. Он хорошо разбирает ответ и ошибку, когда оба они разделены обычным образом. Но я хочу проанализировать успешный ответ, когда получу даже 401 HTTP Exception.

Заранее спасибо ..

Ответ с 401 HTTP выглядит следующим образом.

401 Unauthorized - HTTP Exception 
{"Message":"Authentication unsuccessful","otherData":"//Some data"}

Кстати, я должен проверить код ошибки HTTP ..

if (statusCode==401){
 print("Authentication unsuccessful")
}

1 Ответ

0 голосов
/ 08 сентября 2018

Вы можете использовать класс Retrofit Response для этой цели, который является оберткой для вашего объекта ответа, он имеет как данные вашего ответа и тела ошибок, так и состояние успеха, поэтому вместо выполнения Single<RESPONSE> используйте Single<Response<RESPONSE>> .

Анализ объекта ответа может выглядеть примерно так:

{ t: Response<RESPONSE> ->
if (t.isSuccessful())
    // That's the usual success scenario
else
    // You have a response that has an error body.
}
,
{ t: Throwable ->
    // You didn't reach the endpoint somehow, maybe a timeout or an invalid URL.
}
...