首页 > 解决方案 > 如何在 grails 响应中添加状态消息

问题描述

我创建了一个在每个未捕获的异常之后调用的方法并响应一个 gson 视图:

void handleError(){
        respond([status: 500, view: "/customErr"], [
                code      : 500,
                message   : "whatever internal error",
        ])
}

这工作正常,但我遇到的主要问题是我的客户端(另一台充当客户端的服务器)正在接收状态为 500 的 http 响应,但状态消息为空。我检查了响应文档,但没有看到属性消息或其他内容。如果我的客户收到以下内容:

wslite.rest.RESTClientException: 500 null

并且该 null 是 grails 未设置的响应状态消息 如何在我的响应中添加详细消息?田园诗般的东西是这样的:

  respond([status: 500, statusMessage: "my custom 
    message", view: "/customErr"], [
                code      : 500,
                message   : "whatever internal error",
        ])

标签: grailsgroovy

解决方案


grails 使用Servlet API 的 HttpServletResponse来构建response

现在检查HttpServletResponse类的 java 文档。

只有 2 种方法来定义状态消息:

  • void setStatus(int sc, String msg) 已弃用。从 2.1 版开始,由于 message 参数的含义不明确。要设置状态代码,请使用 setStatus(int),要发送带有描述的错误,请使用 sendError(int, String)。
  • void sendError(int sc, String msg)使用指定状态向客户端发送错误响应并清除缓冲区。服务器默认创建响应,使其看起来像包含指定消息的HTML 格式的服务器错误页面,将内容类型设置为“text/html”。

第一个已弃用。第二个发送状态消息,但它不会发送正文 - 主要用于致命错误......

因此,官方通过 servlet 文档无法同时发送消息和正文作为响应。


这个问题很棘手。因为根据 Apache Tomcat,“自定义状态消息”功能将从版本 9 开始删除:https ://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html#Other

但是根据RFC2616 sec 6.1.1:这里列出的原因短语只是建议——它们可以被本地等效替换而不影响协议。


推荐阅读