#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 параметров