我正在用 clojure 编写一个服务(使用 ring 和 compojure),它应该会改变状态消息。它在嵌入式 Jetty 8 上运行。例如我有
200 OK
我想要类似的东西
200 <custome message>
在 EJB 世界中,有可能设置标头“X-Http-Status-Message”,它在幕后发挥作用并更改消息作为响应。
Jetty 中是否有任何标题允许我做同样的事情?或者在clojure中有没有其他方法可以做到这一点?
我正在用 clojure 编写一个服务(使用 ring 和 compojure),它应该会改变状态消息。它在嵌入式 Jetty 8 上运行。例如我有
200 OK
我想要类似的东西
200 <custome message>
在 EJB 世界中,有可能设置标头“X-Http-Status-Message”,它在幕后发挥作用并更改消息作为响应。
Jetty 中是否有任何标题允许我做同样的事情?或者在clojure中有没有其他方法可以做到这一点?
根据 Ring 文档,您只能设置状态码,而不是消息:
https://github.com/mmcgrana/ring/wiki/Concepts
此外,该ring.util.servlet/set-status
函数调用javax.servlet.http.HttpServletResponse .setStatus(int)
:
(defn set-status
"Update a HttpServletResponse with a status code."
[^HttpServletResponse response, status]
(.setStatus response status))
整个实现在这里:https ://github.com/ring-clojure/ring/blob/master/ring-servlet/src/ring/util/servlet.clj#L64
更改 Ring 以添加对状态消息的可选支持应该是相当简单的。
我想可以将更改引入ring.util.servlet/update-servlet-response
函数:
(defn update-servlet-response
"Update the HttpServletResponse using a response map."
[^HttpServletResponse response, {:keys [status headers body]}]
(when-not response
(throw (Exception. "Null response given.")))
(when status
(set-status response status))
(doto response
(set-headers headers)
(set-body body)))
例如,通过向响应映射添加状态消息键。
https://github.com/ring-clojure/ring/blob/master/ring-servlet/src/ring/util/servlet.clj#L105
不是这样的魔术头。
状态原因必须与 Jetty 中同一调用中的状态代码一起设置。
您可以使用javax.servlet.http.HttpServletResponse.setStatus(int, String)
或org.eclipse.jetty.server.Response.setStatus(int, String)
。
例子:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setStatus(HttpServletResponse.SC_OK, "Alrighty");
}
请注意,某些错误条件无法覆盖此状态原因。但通常,使用 ofHttpServletResponse.sendError(int, String)
会如您所愿。