ОПУБЛИКОВАТЬ проверку параметров в Akka HTTP

#akka-http

#akka-http

Вопрос:

Возможно ли проверить текст POST в Akka Http?

Проверка класса Case, похоже, работает только для запросов get.

В качестве примера:

 case class User(name: String){
    require(name)
}
 ..... 
(post amp; entity(as[User])) { user =>
            complete(doSomething(user.name))
          }
  

Я бы хотел, чтобы приведенный выше код выдавал отклонение ValidationRejection

Ответ №1:

Вы можете использовать require внутри области действия директивы complete

 (path("stats") amp; parameter("idsParam")) { idsParam =>
    complete {
      require(idsParam.length > 1)
      val ids = idsParam.split(",").map(v => CaseId(v).value)
      DBManager.getArticleStats(ids).map { case (id, stats) => IdWithValue(CaseId(id), stats) }
    }
}
  

который обрабатывает ваш POST-запрос.

И обычно у меня есть пользовательский обработчик исключений, который обертывает все исключения в формат, который ожидает мой клиент API, такой как json. require выдает IllegalArgumentException ошибку, поэтому давайте обработаем это особым образом, если захотим.

 protected implicit def myExceptionHandler =
  ExceptionHandler {
    case ex: IllegalArgumentException => ctx => {
      val cause = ex.getCause
      ex.printStackTrace()
      ctx.complete(StatusCodes.InternalServerError, ErrorResponse(ex.code, ex))
    }
    case ex: Throwable => ctx =>
      logger.warning("Request {} could not be handled normally", ctx.request)
      ex.printStackTrace()
      ctx.complete(StatusCodes.InternalServerError, ErrorResponse(StatusCodes.InternalServerError.intValue, ex))
  }
  

где ErrorResponse находится мой класс case, который сериализуется в json с использованием spray-json

Комментарии:

1. Спасибо. Не могли бы вы поделиться примером? Не совсем уверен, как использовать require внутри complete

2. Конечно. Добавлено.

3. Спасибо! Не требуется ли, предположим, выдавать ValidationRejection?

4. Нет, require это общая вспомогательная функция. Это не связано с akka-http само по себе.

5. Существует doc.akka.io/docs/akka/2.4.3/scala/http/routing-dsl/… . Но я предполагаю, что это работает только для GET параметров