Распылительная маршрутизация работает на одну косую черту, но больше ничего
Так что я спрашивал об этом раньше и изменил много кода вокруг.
Спрей-маршрутизация ничего не соответствует
Теперь я выполняю свои функции, которые возвращают 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 и извлекать то, что мне нужно, из контекста запроса, используя директивы, и передавать ТО в функции