喷涂路由适用于单斜杠,但没有别的

时间:2015-11-28 18:22:44

标签: scala routing akka spray spray-routing

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

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))
        }
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

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

很多这些指令实际上都没有提取任何东西,所以有了lambda输入我就像req =>和req2 =>不行。

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

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

我做了这个

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

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