Распылительная маршрутизация работает на одну косую черту, но больше ничего

Так что я спрашивал об этом раньше и изменил много кода вокруг.

Спрей-маршрутизация ничего не соответствует

Теперь я выполняю свои функции, которые возвращают HTTP-ответы внутри блока detach(), так что я не блокирую. Затем они завершаются и возвращаются клиенту, но я все еще не могу заставить мою маршрутизацию работать.

В моих тестах запрос на одиночную косую черту работает нормально, но все остальное, например, этот путь создания пользователя, показанный ниже, не выполняется. Кажется, я не могу понять, почему, а для распыления используется так много конструкций, что мне трудно понять, как система работает достаточно хорошо, чтобы выяснить, что происходит.

Я попытался вставить блоки logRequest вокруг определенных путей, думая, что это могло бы показать мне, что происходит, но ни один из них, похоже, не пострадал. Любая помощь будет принята с благодарностью.

val route: Route = {
    host("fakebook.com", "www.fakebook.com") {
      pathSingleSlash {
        complete("pong")
      } ~
        pathPrefix("users") { req =>
            path("newuser") {
                put {
                  detach() {
                    complete(genericPut(CreateUser(req.request)))
                  }
                }
            } ~
            ... rest of routing

И вот как выглядят мои скаляшки: простой пут проходит, а пут с newuser - нет

val createUserSuccessRequest = Put(Uri("http://www.fakebook.com/users/newuser") withQuery(F_User.lastNameString -> "Doe", F_User.firstNameString -> "John", F_User.bioString -> "i like foobar",
    F_User.ageString -> "42", F_User.dobString -> dateFormatter.format(new Date(1970 - 1900, 5, 7))))

 "The FakeBook route" when {

    "When sending a single slash request" should {
      "respond with a simple pong" in {
        Get() ~> logRequestResponse("plain get final request and response")(sealRoute(route)) ~> check {
          assert(responseAs[String] == "pong")
        }
      }
    }

    "Running route to create a user with PUT" should {
      "forward a message to the backbone to create a new user" in {
        createUserSuccessRequest ~> logRequest("create user final request and response"){sealRoute(route)} ~> check {
          expectMsg(CreateUser(createUserSuccessRequest))
        }
      }
    }
  }

1 ответ

Для всех, кто пытается решить эту проблему:

многие из этих директив на самом деле ничего не извлекают, поэтому, имея такие лямбда-входы, как req => и req2 =>, работать не будет.

Оказывается, распылительная маршрутизация разработана таким образом, что вам никогда не придется прикасаться к RequestContext, как я делал с моими функциями (именно поэтому я пытаюсь получить к нему доступ). Они извлекают только полезные данные. Вместо того, чтобы делать вещи, как я должен, и менять сигнатуры функций, я собираюсь (на данный момент) сделать исправление, которое сработало.

если вам абсолютно необходимо иметь requestcontext, если вы как-то его не нарушаете, вы можете извлечь его, сделав свою собственную директиву извлечения, например, такval extractRequestContext = extract(x => x) и заверните свой код в это

я сделал это

path("somepath") {
     detach() {
          extractRequestContext { request => complete(someFunc(request)) }
     }
}

В будущем я должен научиться более правильно использовать DSL и извлекать то, что мне нужно, из контекста запроса, используя директивы, и передавать ТО в функции

Другие вопросы по тегам