1

我正在使用 Spray Routing 尝试使用不同的 HTTP 方法匹配路由,但是当我执行 GET 请求时,它实际上会通过 DELETE、PUT 和 GET。我认为deleteput拒绝了所有不是 HTTP DELETE 或 HTTP PUT 的请求。

这是我的基本代码:

path(Segment ~ Slash.?) { id =>
  delete {
    println("Hello from DELETE")
    //do stuff for delete
    complete("done for DELETE")
  } ~
  put {
    println("Hello from PUT")
    //do stuff for put
    complete("done for PUT")
  } ~
  get {
    println("Hello from GET")
    //do stuff for get
    complete("done for GET")
  }
}

如果我触发 GET 请求,我可以看到应用程序正在打印:

Hello from DELETE
Hello from PUT
Hello from GET

我错过了任何回电或其他什么吗?

4

1 回答 1

4

不,您的代码(几乎)是正确的。

问题在于,在喷雾中,存在于方法匹配器中但不存在于提取下的代码(“提取”某些东西的指令之一,例如“参数”或“段”)始终执行。

在您的情况下,您正确匹配路径提取器,但之后该路由对所有 get put delete 等执行。

解决方案是在 get/put 等下方添加“动态”关键字。缺点是您会失去一些性能。

path(...) {
  get {
    dynamic {
      ...
    }
  }
}

或者,您可以重新调整代码,使方法匹配器位于顶层,路径提取器位于其下

get {
   path(...) {
     ...
   }
}
于 2015-01-19T09:19:24.643 回答