我试图使用环路由实现的行为在这个问题中被大致描述。
基本上,我有一些以斜杠结尾的 URL,并且我正在尝试创建一个中间件,该中间件将从例如重定向example.com/foo
到example.com/foo/
当且仅当/foo/
是有效的 URL 而/foo
不是有效的 URL。
我目前正在使用这个中间件
(defn good-response? [resp]
(and resp (not= (:status resp) 404)))
(defn wrap-slash [handler]
(fn [{:keys [uri] :as req}]
(let [resp (handler req)]
(if (or (good-response? resp) (.endsWith "/" uri))
resp
(let [added-slash (str uri "/")]
(if (good-response? (handler (assoc req :uri added-slash)))
(redirect added-slash)
resp))))))
几乎所有它应该做的事情:它从重定向/foo
到/foo/
iff/foo/
存在并且/foo
不存在。
我担心的是,这个解决方案(handler req)
至少会调用两次——一次是在请求/foo
时,一次是在客户端请求重定向的 URL 时。现在这不是问题,但我可以想象对于具有数百个数据库查询或类似事情的一些慢速页面的响应时间加倍是痛苦的。
有没有办法简单地检查给定 URL 的处理程序是否存在,而不调用该处理程序?我们可以通过说变得(:body request)
懒惰来完全避免这个问题吗?