在许多ZIO-HTTP端点声明前加前缀“api”

后端开发 2026-07-12

我使用 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章