grails - 如何在 grails 响应中添加状态消息

标签 grails groovy

我创建了一个在每个未捕获的异常之后调用的方法并响应一个 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/

    相关文章:

    xml - 如何使用 Groovy 在 xml 中插入/移动/删除节点?

    grails - 为 Grails 应用程序构建漂亮 UI 的快速方法?

    grails - 将Spring Security依赖项添加到Grails插件

    grails - 如何在grails中为createCriteria的从和到日期之间写从句?

    groovy - 如何使用 groovy 脚本识别 Jenkins 上的管理员

    testing - 如何模拟闭包以测试 Grails 服务结果?

    multithreading - 记录进程输出的 Groovy 方式

    grails - Grails:显示变量时删除不需要的支架

    grails - 使用Domain.load()代理替代Domain CRUD方法

    Grails 按需执行任务