1

所以我之前问过这个问题,并改变了很多代码。

喷涂路由不匹配任何东西

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

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

我尝试在某些路径周围插入 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

这是我的scalatest的样子,简单的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))
        }
      }
    }
  }
4

1 回答 1

1

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

很多这些指令实际上不提取任何东西,所以像 req => 和 req2 => 这样的 lambda 输入将不起作用。

事实证明,喷雾路由的设计使您永远不必像我对函数所做的那样触摸 RequestContext(这就是我尝试访问它的原因)。他们只提取有用的数据。我不会做我应该做的事情并更改我的函数签名,而是(现在)做一个有效的修补程序。

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

我做了这个

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

将来我应该学会更正确地使用 DSL 并使用指令从请求上下文中提取我需要的内容并将 THOSE 传递给函数

于 2015-11-28T20:17:12.760 回答