我正在使用clojure(使用ring和compojure)编写服务,该服务应该更改状态消息。它在嵌入式Jetty 8上运行。例如我有
200 OK
我想要像
这样的东西200 <custome message>
在EJB世界中,有可能设置标题“X-Http-Status-Message”,它在场景后面做了一些魔术,并在响应中更改了消息。
Jetty中是否有任何标题允许我做同样的事情? 或者在clojure中还有其他方法吗?
答案 0 :(得分:0)
没有像这样的魔法标题。
状态原因必须与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");
}
请注意,无法覆盖此状态原因的某些错误情况。但通常情况下,使用HttpServletResponse.sendError(int, String)
的行为与预期的一样。
答案 1 :(得分:0)
根据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)))
例如,通过向响应映射添加status-message键。
https://github.com/ring-clojure/ring/blob/master/ring-servlet/src/ring/util/servlet.clj#L105