Akka Http извлекает строковое значение с помощью Segment PathMatcher

Я пытаюсь реализовать простой API, где я могу получить параметр пути как String. Вот мой тестовый код:

class SimpleRouteTest extends WordSpec
  with Matchers
  with ScalatestRouteTest {

  val routes: Route = pathPrefix("foo") {
    get {
      complete("GET /foo")
    } ~
    pathPrefix(Segment) { seg =>
      get {
        complete(s"GET /foo/$seg")
      }
    }
  }

  "The routes should handle" should {
    "GET /foo correctly" in {
      Get("/foo") ~> routes ~> check {
        responseAs[String] shouldBe  "GET /foo"
      }
    }
    "GET /foo/any" in {
      Get("/foo/any") ~> routes ~> check {
        responseAs[String] shouldBe  "GET /foo/any"
      }
    }
  }

}

К сожалению, второй тест не проходит с сообщением:

«GET /foo[]» не равно «GET /foo[/any]»

Кто может подсказать, что я делаю не так?

Спасибо


person Alex Fruzenshtein    schedule 03.04.2017    source источник


Ответы (1)


Вот что пытается сделать ваш код:

  • сопоставить путь с префиксом /foo
  • если метод GET, добавьте "GET /foo"
  • иначе если оставшийся путь начинается с некоторого сегмента seg, завершается s"GET /foo/$seg"

Оператор ~ останавливается на первом операнде, поскольку выполняются все условия (начинается с /foo и является GET). Возможно, вы захотите передать более точное значение в качестве первого операнда или указать, что в первом случае вам нужен PathEnd.

person Cyrille Corpet    schedule 03.04.2017
comment
Ой ну спасибо. Я пропустил эту деталь (~), когда читал http-документы akka :( - person Alex Fruzenshtein; 03.04.2017
comment
Пожалуйста. Пожалуйста, отметьте ответ как принятый, если он вам нравится, чтобы он мог помочь будущим пользователям SO. - person Cyrille Corpet; 03.04.2017