akka http handleNotНайдено отклонение работает только для метода POST - PullRequest
0 голосов
/ 26 марта 2020

у меня есть следующий akka http код обработки отклонения, взятый из https://doc.akka.io/docs/akka-http/current/routing-dsl/rejections.html

val message = "The requested resource could not be found."
  implicit def myRejectionHandler = RejectionHandler.newBuilder()

    .handleNotFound {
      complete(HttpResponse(NotFound
        ,entity = HttpEntity(ContentTypes.`application/json`, s"""{"rejection": "$message"}"""
      )))
    }.result()

      val route: Route = handleRejections(myRejectionHandler) {
        handleExceptions(myExceptionHandler) {
          concat(
            path("event-by-id") {
              get {
                parameters('id.as[String]) {
                  id =>
complete("id")
                }
              }
            }
            ,
            post {
              path("create-event") {
                entity(as[Event]) {
                  event =>
                        complete(OK, "inserted")
                }
              }
            }
          )
        }
      }
    }

 val bindingFuture = Http().bindAndHandle(route, hostName, port)

когда я нажимаю localhost:8080/random

я получил сообщение

HTTP method not allowed, supported methods: POST

и когда я выбираю POST и нажимаю localhost:8080/random, я получаю сообщение

{
    "rejection": "The requested resource could not be found."
}

почему я не получаю то же сообщение, когда мой запрос маршрута был GET? в документах handleNotFound работал с GET-запросом https://doc.akka.io/docs/akka-http/current/routing-dsl/rejections.html

1 Ответ

0 голосов
/ 26 марта 2020

Это происходит, вероятно, из-за порядка используемых вами директив: в вашей конфигурации, если входящий запрос не совпадает с event-by-id путем URL, тогда он переходит к следующему обработчику, который ожидает, что запрос должен иметь * 1002 Метод прежде всего, потому что директива post идет первой, перед path("create-event").

Вы можете попытаться изменить порядок директив на следующий, для второго маршрута:

path("create-event") {
 post {
  entity(as[Event]) { event =>
     complete(OK, "inserted")
   }
 }
}

Надеюсь, это поможет!

...