Scala 喷涂布线适用于单斜线,但不适用于其他任何情况

Scala 喷涂布线适用于单斜线,但不适用于其他任何情况,scala,routing,akka,spray,spray-routing,Scala,Routing,Akka,Spray,Spray Routing,所以我以前问过这个问题,并且修改了很多代码 现在,我正在执行在detach()块中返回httpresponse的函数,这样我就不会阻塞。然后这些都完成并返回给客户,但我似乎仍然无法让我的路由正常工作 在我的测试中,对单个斜杠的请求可以正常工作,但其他任何操作,例如下面显示的创建用户路径,都会失败。我似乎不明白为什么,而喷洒路线使用了如此多的构造,我很难弄清楚系统是如何工作的,足以找出发生了什么 我尝试在某些路径周围插入logRequest块,以为这可能会告诉我发生了什么,但它们似乎都没有被击中

所以我以前问过这个问题,并且修改了很多代码

现在,我正在执行在detach()块中返回httpresponse的函数,这样我就不会阻塞。然后这些都完成并返回给客户,但我似乎仍然无法让我的路由正常工作

在我的测试中,对单个斜杠的请求可以正常工作,但其他任何操作,例如下面显示的创建用户路径,都会失败。我似乎不明白为什么,而喷洒路线使用了如此多的构造,我很难弄清楚系统是如何工作的,足以找出发生了什么

我尝试在某些路径周围插入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传递,但是使用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))
        }
      }
    }
  }

对于试图解决此问题的任何其他人:

很多指令实际上不提取任何内容,因此使用我使用的lambda输入,如req=>和req2=>将不起作用

事实证明,喷洒路由的设计使您永远不必像我使用函数那样接触RequestContext(这就是我尝试访问它的原因)。他们只提取有用的数据。与其做我应该做的事情,改变我的函数签名,我将(现在)做一个已经成功的修补程序

如果您绝对必须拥有requestcontext,只要您没有以某种方式破坏它,您可以通过如下方式生成自己的提取指令来提取它
val extractRequestContext=extract(x=>x)
并将您的代码包装在其中

是我干的

path("somepath") {
     detach() {
          extractRequestContext { request => complete(someFunc(request)) }
     }
}
在将来,我应该学会更正确地使用DSL,使用指令从请求上下文中提取我需要的内容,并将其传递给函数