我创建了一个在每个未捕获的异常之后调用的方法并响应一个 gson View :
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",
])
最佳答案
grails 使用 Servlet API’s HttpServletResponse build response .
现在检查 HttpServletResponse 的 Java 文档类(class)。
只有 2 种方法来定义状态消息:
void setStatus(int sc, String msg)
已弃用 .从 2.1 版开始,由于 message 参数的含义不明确。要设置状态代码,请使用 setStatus(int),要发送带有描述的错误,请使用 sendError(int, String)。 void sendError(int sc, String msg)
使用指定状态向客户端发送错误响应并清除缓冲区。服务器默认创建的响应看起来像 HTML 格式的服务器错误页面 包含指定的消息,将内容类型设置为“text/html”。 第一个已弃用。第二个发送状态消息,但它不会发送正文 - 主要用于 fatal error ......
因此,官方通过 servlet 文档无法同时发送消息和正文作为响应。
这个问题很棘手。因为根据 Apache Tomcat,“自定义状态消息”功能将从版本 9 开始删除:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html#Other
但根据 RFC2616 sec 6.1.1 : 这里列出的原因短语只是建议 -- 它们可能会被替换 通过本地等效而不影响协议(protocol)。
关于grails - 如何在 grails 响应中添加状态消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54929473/