如何以编程方式执行拒绝处理程序路由并获得结果HttpEntity?

时间:2016-01-21 12:56:16

标签: scala spray akka-http

如何以编程方式执行拒绝处理程序Route并获得结果HttpEntity

例如假设我有RequestContext个对象和Rejection个对象,我想在其上执行RejectionHandler.default并获得HttpEntity

以下是我要做的事情的例子:

implicit def myRejectionHandler =
  RejectionHandler.newBuilder()
    .handleAll[Rejection] { rejections ⇒

    def prefixEntity(entity: ResponseEntity): ResponseEntity = entity match {
      case HttpEntity.Strict(contentType, data) => {
        import spray.json._
        val text = ErrorResponse(0, "Rejection", data.utf8String).toJson.prettyPrint
        HttpEntity(ContentTypes.`application/json`, text)
      }
      case _ =>
        throw new IllegalStateException("Unexpected entity type")
    }

    val route: Route = extractRequestContext { ctx =>
      mapResponseEntity(prefixEntity) {
        // Here I want result of `complete` route from RejectionHandler.default
      }
    }
    route
  }
    .handleNotFound {
      complete((NotFound, "Not here!"))
    }
    .result()

1 个答案:

答案 0 :(得分:2)

我想我得到了你想要的东西。您可以在注释所在的位置应用默认拒绝处理程序。唯一的问题是apply返回Option,如果遇到的拒绝没有点击拒绝处理程序中的任何内容,那么None将会getOrElse。这不太可能,因为您使用的是默认处理程序,它几乎可以处理所有内容,但您仍需要在代码中对其进行说明(因此我的InternalServerError会产生通用的val defaultRejectionHandler = RejectionHandler.default implicit def myRejectionHandler = RejectionHandler.newBuilder() .handleAll[Rejection] { rejections ⇒ def prefixEntity(entity: ResponseEntity): ResponseEntity = entity match { case HttpEntity.Strict(contentType, data) => { import spray.json._ val text = ErrorResponse(0, "Rejection", data.utf8String).toJson.prettyPrint HttpEntity(ContentTypes.`application/json`, text) } case _ => throw new IllegalStateException("Unexpected entity type") } val route: Route = extractRequestContext { ctx => mapResponseEntity(prefixEntity) { defaultRejectionHandler.apply(rejections).getOrElse{ complete(StatusCodes.InternalServerError) } } } route } .handleNotFound { complete((NotFound, "Not here!")) } .result() )。修改后的代码如下所示:

RequestContext

这编译,但我实际上没有测试它,看看我们是否得到了预期的效果。此外,我不需要ctxextractRequestContext,因此您可以删除其中的Rows | TotalCount 1 | 20 2 | 30 3 | 10 4 | 60 图层。