Jetty自定义状态消息??

时间:2013-04-16 16:20:49

标签: rest clojure jetty embedded-jetty

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

200 OK 

我想要像

这样的东西
200 <custome message>

在EJB世界中,有可能设置标题“X-Http-Status-Message”,它在场景后面做了一些魔术,并在响应中更改了消息。

Jetty中是否有任何标题允许我做同样的事情? 或者在clojure中还有其他方法吗?

2 个答案:

答案 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