在许多ZIO-HTTP端点声明前加前缀“api”
我使用 ZIO-http 的声明式端点,我很喜欢它们能够从中生成文档。我想给所有端点添加一个前缀(“api”),但我不想逐个查看每个Endpoint的声明并手动把“api”加到所有路径上。
我尝试查找一个可以应用于整个路由集合的 “prefix” 或 “nest” 方法,但我能找到的最接近的方法就是 “literal” 方法。当我把 literal("api") 添加到已实现的路由集合中,然后访问 /api/activities 时,出现了一个意料之外的错误:
Codec Error
There was an error en-/decoding the request/response
MalformedPath
Malformed path /api/activities failed to decode using /activities: Expected path segment "activities" but found end of path
我一直在努力弄清楚在下面的代码片段中自己漏掉了什么,或者哪里搞砸了:
val getActivities = Endpoint((GET / "activities"))
.out[CollectionResponse[ActivitySummary]]
.outError[ErrorResponse](Status.InternalServerError)
.examplesOut(("Response", exampleActivitySummaryResponse()))
val routes = Routes(
getActivities.implement(_ => handleGetAll())
)
val apiRoutes = literal("api") / routes
我确实添加了一个未被定义为Endpoint的测试路由,literal("api") 起作用了:
val sanity = literal("api") / Routes(
Method.GET / "ping" -> zio.http.handler(Response.text("pong")),
)
一旦把 literal("api") 添加到包含Endpoint声明的集合中,我就会得到我之前提到的错误;而不使用 literal("api") 时,行为如预期并显示数据。有什么建议或想法来修复这个问题吗?
依赖版本
- zio-http: 3.8.1
- zio: 2.1.22
- Scala: 3.8.1
解决方案
你可以创建一个辅助方法并在各处使用它:
def baseEndpoint(method: Method, path: String) =
Endpoint((method / "api" / path))
val getActivities = baseEndpoint(GET, "activities")
这只是一个示例,你可以想象它的几种变体。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。