我的Akka HTTP应用程序将一些请求反向代理到内部HTTP系统:
pathPrefix("/api/") {
(path("some-upload-endpoint") & post) {
withSizeLimit(10 * 1024 * 1024) {
reverseProxyToBackend(rc)
}
} ~ reverseProxyToBackend(rc)
}
reverseProxyToBackend
是一个自定义指令,它接收传入的请求,添加一些标头并根据剩余的不匹配的路径将其转发到后端系统。 IOW,/api/foobar
变为backend.example.com/foobar
。
对于某个路径some-upload-endpoint
但是我需要增加前端的默认大小限制,因为我们期望更大的请求到此端点。
不幸的是,path("some-upload-endpoint")
消耗了剩余的路径,因此上面的代码reverseProxyToBackend
会转发到backend.example.com
而不是backend.example.com/some-upload-endpoint
,这是不是我想要的。
如何匹配Akka HTTP中的路径,但不使用它?换句话说,我可以使用哪些指令来保持路径匹配器不受影响的不匹配路径?如果没有这样的指令,我该如何恢复无与伦比的路径?
答案 0 :(得分:2)
extractMatchedPath
应该"重建"已经匹配的路径。来自文档:
extractMatchedPath指令提取已经存在的路径 由任何PathDirectives(或任何自定义的PathDirectives)匹配 请求上下文的不匹配路径字段)。你可以用它 构建在其逻辑中使用已匹配部分的指令。
答案 1 :(得分:0)
添加到Ramon的答案中,您可以使用mapRequestContext恢复不匹配的路径:
extractMatchedPath { matchedPath =>
mapRequestContext(_.withUnmatchedPath(matchedPath)) { // reset the "unmatchedPath"
...
}
}
您可能还对pathPrefixTest,rawPathPrefixTest等感兴趣。基本上,pathPrefixTest类似于pathPrefix,但它并不“消耗”路径段。