Отметить успешный ответ сиесты как ошибку

Я работаю с действительно странным (и неприятным) API, который я не могу контролировать, и, к сожалению, когда делается неправильный запрос, вместо ответа со статусом 4xx, он отвечает со статусом 200.

С помощью этого ответа он также изменяет тело ответа с обычного ответа XML на обычный текст, но не меняет заголовок типа содержимого. Вы можете представить, как это раздражает!

У меня есть Siesta, работающая с API, и тот факт, что он на самом деле не является RESTful, но я не уверен, как заставить работать следующую часть - обработку неудачных запросов.

Как мне преобразовать технически действительный и успешный ответ 200 в ответ об ошибке? Прямо сейчас у меня есть следующие настройки:

configure("/endpoint") {
  $0.mutateRequests { req in
    ... perform some mutation to request ...
  }
  $0.pipeline[.parsing].add(self.XMLTransformer)
}

configureTransformer("/endpoint") {
  ($0.content as APIResponse)
    .data()
    .map(Resource.init)
}

Это работает очень хорошо, когда ответ на самом деле является XML, однако в случае, когда ответ является ошибкой, я получаю следующее:

bad api request: invalid api key

или что-то похожее на это. Класс XMLParser уже обрабатывает это и, в свою очередь, помечает себя как обнаружившего ошибку, однако я не знаю, как заставить Сиесту осознать, что есть ошибка, и не вызывать мой преобразователь, а вместо этого пометить запрос как сбойный. чтобы я мог обработать ошибку в другом месте.

Как я могу достичь того, что я после?

1 ответ

Решение

configureTransformer это всего лишь обычное сокращение для полнофункциональных (но более многословных) произвольных преобразователей, поддерживаемых конвейером Сиесты. Полные преобразователи могут произвольно преобразовать любой ответ в любой другой, включая успех → неудача и неудача → успех. Руководство пользователя обсуждает это немного.

Вы можете увидеть это в действии в примере проекта, в котором есть преобразователь клиента, который делает нечто очень похожее на то, что вы хотите, превращая ошибку 404 в успех с контентом false, Это настроено здесь и определено здесь. В этом примере выполняется преобразование "ошибка → успех", но вы должны найти код, адаптируемый для целей "успех → неудача".

Другие вопросы по тегам