Spray:查询作为 URI 或参数的一部分

Spray: query as part of URI or parameter

我尝试允许 API 有两种用法:将查询作为 URI 的一部分提供或将其作为参数提供。

端点

/search/myQuery等同于/search?query=myQuery

两者应该return相同的结果。

代码

这是我目前使用的实现方式。虽然感觉有点笨拙,因为很多代码需要重复。

path("search") {
  parameter('query) { term =>
    get {
     complete { performSearch(term) }
    }
} ~
path("search" / Segment) { searchTerm =>
  get {
    complete { performSearch(term) }
  }
}

问题

在 Spray 中是否有更 DRY 的方式来表达这种行为?

Spray 具有非常强大的组合子,因此它是非常微不足道的任务。

val pathOrParameter = path(Segment) | parameter('search)

path("search") {
  pathOrParameter { term =>
    get {
     complete { performSearch(term) }
    }
  }
}

除此之外,您还可以进一步组合:

val searchApi = get & path("search") & (path(Segment) | parameter('search))

searchApi { term =>
  complete { performSearch(term) }
}

Custom Directive 页面详细解释了 spray 编写指令的能力。