Spark框架:匹配是否带有尾斜杠

14

我注意到 Spark 框架中的一个问题。它不会将结尾斜杠与映射的路由匹配。因此,它认为 /api/test 和 /api/test/ 是不同的 URI。

如果有一种方法可以通配它们在一起,那就很好了,但似乎并没有。我有什么遗漏吗?

我想要这个路由:

Spark.get("/api/test", (req, res) -> {
            return "TEST OK";
        });

为了匹配 /api/test 或者 /api/test/. 当前情况下只能匹配 /api/test,如果我要切换到:
Spark.get("/api/test/", (req, res) -> {
            return "TEST OK";
        });

它只匹配/api/test/


我对Spark一无所知...但如果URI是正则表达式,那么你可以在最后一个**/之后添加一个?**。 - Augusto
2个回答

12
您可以通过重定向设置一个 "before" 过滤器,例如:
Spark.before((req, res) -> {
    String path = req.pathInfo();
    if (path.endsWith("/"))
        res.redirect(path.substring(0, path.length() - 1));
});

这可能比映射重复的路线更好。


更好的选择 - mtyson

7

这似乎在2013年被提出过,但在2015年关闭了(我认为没有实施):

https://github.com/perwendel/spark/issues/97

路由应该匹配带和不带尾随斜杠 #97 jsnoriegam于2013年8月31日提出了这个问题 ryber在2013年10月14日提交了一个与此问题相关的修复 tipsy在2015年11月22日添加了功能请求标签 perwendel在2015年11月23日关闭了此问题
ryber提交了一个修复此问题的拉取请求:

https://github.com/ryber/spark/commit/556597e679dc224719188f8d27d8ba10e58fd8bb

然而,这似乎不是当前的 SimpleRouteMatcher 类的一部分:

https://github.com/perwendel/spark/blob/ded78b7fa9b78749c0d5f6776bba9c9cd3cfb6fb/src/main/java/spark/route/SimpleRouteMatcher.java


我想我得映射每个路由,带斜线和不带斜线的都要。嗯。 - mtyson
或者深入研究Spark代码并建议另一个拉取请求,但不清楚是否会被接受。无论如何祝你好运。 - Freek de Bruijn
我认为通常(例如Sinatra?)会允许正则表达式,因此您可以以/?结尾。那可能很好。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接