akka-http应用routing DSL配置错误无法访问session路由及获取路径参数问题
路由404问题原因
你当前的session路由嵌套方式不符合Akka HTTP的路径匹配规则:
- 外层的
path("session")是全量匹配剩余路径,匹配/session路径后会直接清空剩余的路径片段,导致嵌套在内层的path("getByToken")没有可匹配的内容,因此访问/session/getByToken会返回404。如果要实现多层路径的嵌套匹配,外层应该用pathPrefix匹配路径前缀,保留剩余路径给内层路由处理。
支持路径参数的修改方案
要实现/session/getByToken/abc123abc123abc1234形式的调用,你可以通过Segment路径匹配器捕获尾部的token字符串参数,修改后的路由代码如下:
val boardRoutes = path("board") { get { complete("board#index route") } } val sessionRoutes = concat( // 外层用pathPrefix匹配/session前缀,保留剩余路径给内层匹配 pathPrefix("session") { concat( // 匹配getByToken + 字符串参数,将捕获的参数绑定到token变量 path("getByToken" / Segment) { token => get { // 这里可以直接使用拿到的token参数 complete(s"session#load route, tokenId: $token") } }, path("login") { post { complete("session#login route") } }, path("logout") { delete { // 原代码此处返回内容有误,已修正为logout相关返回 complete("session#logout route") } } ) } ) val routes = chatRoute ~ boardRoutes ~ sessionRoutes
修改后即可正常使用目标调用方式,路由中可以直接通过绑定的token变量拿到传入的字符串参数。如果需要同时支持不带参数的/session/getByToken访问,额外加一条无参数的path("getByToken")匹配规则即可。
内容的提问来源于stack exchange,提问作者Blankman
相关产品推荐
相关产品推荐

