我正在使用带有ring / compojure的解析器,并希望使用解放器defresource
宏来处理授权。我可以轻松地handle-ok
输出浏览器识别的html,但handle-unauthorized
会在pre
标记中输出html。
我怀疑我无法找到如何做到这一点意味着有充分的理由不这样做。我在网上看到的所有示例都显示handle-unauthorized
返回文字,但我希望显示自定义页面。
这是我正在使用的代码(的一个版本)。我正在使用Hiccup:
(defresource deny-all :authorized? (fn [_] false) :available-media-types ["text/html"] :handle-ok (fn [ctx] (html5 [:body [:h1 "Yes!"]]))) :handle-unauthorized (fn [ctx] (html5 [:body [:h1 "Noooo!"]])))
我从浏览器中获得的是文字
<!DOCTYPE html>
<html><body><h1>Noooo!</h1></body></html>
</pre>
如果我将authorized?
更改为true,则会正确输出html。
我尝试过返回响铃式响应,但这些也会引发错误。我错过了什么?
答案 0 :(得分:2)
在REST talk中,html是资源的许多可能表示之一。由于资源是未经授权的,因此不应返回任何表示,HTML或其他形式。相反,由401状态错误指示的客户端应采取不同的操作过程,例如请求登录页面。
在Web框架中编写的大多数应用程序都不会返回401,而是重定向到授权页面。这在Liberator中也是可能的,因为没有什么能阻止你处理资源本身的授权(使用逻辑处理ok)。
这可能违反了惯例。我在Liberator的github上发布了一个issue来询问那些对RESTful烹饪方法更有见识的人的意见。
无论如何,您认为html包装在预标记中的原因是以下因素的结果:
pre
标记中。我希望这会有所帮助。