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 编写指令的能力。
我尝试允许 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 编写指令的能力。