1

我正在用 clojure 编写一个服务(使用 ring 和 compojure),它应该会改变状态消息。它在嵌入式 Jetty 8 上运行。例如我有

200 OK 

我想要类似的东西

200 <custome message>

在 EJB 世界中,有可能设置标头“X-Http-Status-Message”,它在幕后发挥作用并更改消息作为响应。

Jetty 中是否有任何标题允许我做同样的事情?或者在clojure中有没有其他方法可以做到这一点?

4

2 回答 2

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)))

例如,通过向响应映射添加状态消息键。

https://github.com/ring-clojure/ring/blob/master/ring-servlet/src/ring/util/servlet.clj#L105

于 2013-04-17T23:25:04.837 回答
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");
}

请注意,某些错误条件无法覆盖此状态原因。但通常,使用 ofHttpServletResponse.sendError(int, String)会如您所愿。

于 2013-04-16T17:22:46.483 回答