POST Akka HTTP 中的参数验证
POST param validation in Akka HTTP
是否可以在 Akka Http 中验证 POST 主体?
Case Class Validation似乎只适用于 get 请求。
举个例子:
case class User(name: String){
require(name)
}
.....
(post & entity(as[User])) { user =>
complete(doSomething(user.name))
}
我希望上面的代码抛出 ValidationRejection 拒绝
您可以在完整指令范围内使用 require
(path("stats") & 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
是我的案例 class,正在使用 spray-json
序列化为 json
是否可以在 Akka Http 中验证 POST 主体?
Case Class Validation似乎只适用于 get 请求。
举个例子:
case class User(name: String){
require(name)
}
.....
(post & entity(as[User])) { user =>
complete(doSomething(user.name))
}
我希望上面的代码抛出 ValidationRejection 拒绝
您可以在完整指令范围内使用 require
(path("stats") & 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
是我的案例 class,正在使用 spray-json