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