喷涂自定义状态消息

时间:2015-02-19 15:32:34

标签: spray

我想回复404 Somethingdifferenthere,而不仅仅是404 Not FoundStatusCode课程是密封的,所以我不能自己编造。我也不想覆盖所有404的消息,只是在一个特定情况下。这可能吗?

1 个答案:

答案 0 :(得分:0)

如果要在本地执行此操作,可以使用简单的complete指令。例如:

val aRoute = path("notexisting") {
  get {
    dynamic {
      if (System.currentTimeMillis() % 2 == 0) complete(StatusCodes.NotFound, "Not Found")
      else complete("OK")
    }
  }
}

请注意,如果必须在每个请求上构建路由,则必须使用动态。如果你把它放到complete指令中就可以避免它,如下所示:

val anotherRoute2 = path("notexisting2") {
  get {
    complete {
      if (System.currentTimeMillis() % 2 == 0) HttpResponse(status = StatusCodes.NotFound, entity = "Custom Message")
      else HttpResponse(status = StatusCodes.OK, entity = "All Okay")
    }
  }
}

如果您想全局执行此操作,可以在执行RejectionHandler时提供自己的runRoute。它可以作为隐式值传递。

考虑以下代码片段:

class MyActor extends akka.actor.Actor with HttpService {

  implicit val rejectionHandler: RejectionHandler = RejectionHandler {
    case Nil => complete(StatusCodes.NotFound, "Something Else Here")
  } orElse RejectionHandler.Default

  def receive = runRoute(myRoute) /*implicit rejection handler is applied here */

  def actorRefFactory = context

  val myRoute = path("existing") {
    get {
      respondWithMediaType(MediaTypes.`text/html`) {
        complete {
          <html>
            <body>
              <h1>OK</h1>
            </body>
          </html>
        }
      }
    }
  }

}

将应用自定义rejectionHandler,它会将标准NotFound请求转换为具有文本"Something Else Here"的请求。