Свифт Сиеста перенаправить ответ на сбой

Возможно ли использовать конвейер Siesta, получить ответ об успешном выполнении, проанализировать его и, в зависимости от возврата, перенаправить его на ответ об ошибке?

Мой ответ сервера много раз возвращает HTTP 200, но с сообщением об ошибке / флагом.

1 ответ

Решение

Если под "редиректом" вы подразумеваете "преобразовать HTTP-успех в ошибку Siesta", то да, это возможно. Конвейер может произвольно преобразовывать успехи в ошибки и наоборот.

Напиши ResponseTransformer это разворачивает .success case, проверяет, установлены ли флаги ошибок (какими бы они ни были), и если да, возвращает вновь созданный .failure,

Например, вот эскиз трансформатора, который проверяет X-My-API-Error заголовок на 200, и если он присутствует, возвращает ошибку:

struct APIErrorHandler: ResponseTransformer {
  func process(_ response: Response) -> Response {
    switch response {
      case .success(let entity):
        if let errorMessage = entity.header(forKey: "X-My-API-Error") {
          return logTransformation(
            .failure(Error(userMessage: errorMessage, cause: MyAPIError(), entity: entity)))
        }
        return response

      case .failure:
        return response  // no change
    }
  }
}

Настройте его следующим образом:

service.configure {
  $0.pipeline[.cleanup].add(APIErrorHandler())
}

Также может оказаться полезным изучить трансформатор из примера проекта, который превращает 404 в успешный ответ с false для контента, и тот, который переопределяет сообщение об ошибке Siesta по умолчанию с предоставленным сервером.

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