所以我之前已经问过这个问题并且已经改变了很多代码。
Spray Routing Doesn't match anything
现在我正在执行我的函数,它返回HTTPresponses内部的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
这就是我的scalatests的样子,简单的Put pass,但是newuser的put不会
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))
}
}
}
}
答案 0 :(得分:1)
对于其他试图解决此问题的人:
很多这些指令实际上都没有提取任何东西,所以有了lambda输入我就像req =>和req2 =>不行。
事实证明,喷涂路由的设计使您无需像我对我的函数那样触摸RequestContext(这就是我尝试访问它的原因)。他们只提取有用的数据。而不是做我应该做的事情并改变我的功能签名,我将(现在)做一个有效的修补程序。
如果你绝对必须拥有requestcontext,只要你不以某种方式破坏它,你可以通过制作你自己的提取指令来提取它
val extractRequestContext = extract(x => x)
并将代码包装在
我做了这个
path("somepath") {
detach() {
extractRequestContext { request => complete(someFunc(request)) }
}
}
将来我应该学会更正确地使用DSL并使用指令从请求上下文中提取我需要的内容并将THOSE传递给函数