Akka HTTP中的POST参数验证

时间:2016-10-24 21:56:28

标签: akka-http

是否可以在Akka Http中验证POST主体?

Case Class Validation似乎只适用于获取请求。

举个例子:

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

我希望上面的代码抛出ValidationRejection rejection

1 个答案:

答案 0 :(得分:1)

您可以在完整指令的范围内使用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是我使用spray-json序列化为json的案例类