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

如何在grails响应上添加状态消息,grails,groovy,Grails,Groovy,我创建了一个方法,在每个未修补的异常后调用该方法,并响应gson视图: void handleError(){ respond([status: 500, view: "/customErr"], [ code : 500, message : "whatever internal error", ]) } 这很好,但我遇到的主要问题是,我的客户机(另一个充当客户机的服务器)正在接收状

我创建了一个方法,在每个未修补的异常后调用该方法,并响应gson视图:

void handleError(){
        respond([status: 500, view: "/customErr"], [
                code      : 500,
                message   : "whatever internal error",
        ])
}
这很好,但我遇到的主要问题是,我的客户机(另一个充当客户机的服务器)正在接收状态为500的http响应,但状态消息为null。我检查了回复文档,没有看到属性消息或其他内容。 如果我的客户收到:

wslite.rest.RESTClientException: 500 null
null是响应的状态消息,它不是由grails设置的 如何在回复中添加详细信息?像这样的田园诗:

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

现在检查java文档中的类

只有两种方法可以定义状态消息:

  • 已弃用。从版本2.1开始,由于消息参数的含义不明确。要设置状态代码,请使用setStatus(int),要发送带有说明的错误,请使用sendError(int,String)
  • 使用指定的状态向客户端发送错误响应,并清除缓冲区。服务器默认创建响应,使其看起来像包含指定消息的HTML格式的服务器错误页面,并将内容类型设置为“text/HTML”
第一个是不推荐的。第二个发送状态消息,但不会发送正文-主要用于致命错误

所以,根据servlet文档,无法同时发送消息和响应体


这个问题很棘手。因为根据Apache Tomcat,“自定义状态消息”功能将从版本9开始删除:

但是根据:这里列出的原因短语只是建议--它们可以被本地等价物替换,而不会影响协议。

grails用于构建

现在检查java文档中的类

只有两种方法可以定义状态消息:

  • 已弃用。从版本2.1开始,由于消息参数的含义不明确。要设置状态代码,请使用setStatus(int),要发送带有说明的错误,请使用sendError(int,String)
  • 使用指定的状态向客户端发送错误响应,并清除缓冲区。服务器默认创建响应,使其看起来像包含指定消息的HTML格式的服务器错误页面,并将内容类型设置为“text/HTML”
第一个是不推荐的。第二个发送状态消息,但不会发送正文-主要用于致命错误

所以,根据servlet文档,无法同时发送消息和响应体


这个问题很棘手。因为根据Apache Tomcat,“自定义状态消息”功能将从版本9开始删除:


但根据:此处列出的原因短语仅为建议--它们可能被本地等价物替换而不影响协议。

这不会直接回答您的问题,也可能无法解决您的问题,这取决于您对接收错误的应用程序的控制程度,但是您可以将错误消息添加到响应的头中,该头应该传递给客户机(如果它知道要检查它们的话)


这将在标题中发送消息,并作为响应消息。。。我不知道这是否适用于
respond()
,或者它如何与控制器中的
response
对象交互。。。但是,如果您响应将视图呈现为错误页面,则应该能够将消息添加到
respond()
调用中包含的
模型中,并在错误页面上显示该消息(至少,我认为是这样)。

这并不能直接回答您的问题,并且可能无法解决问题,这取决于您对接收错误的应用程序的控制程度,但您可以将错误消息添加到响应的标头中,该标头应传递给客户端(如果它知道检查错误消息)


这将在标题中发送消息,并作为响应消息。。。我不知道这是否适用于
respond()
,或者它如何与控制器中的
response
对象交互。。。但是,如果您响应将视图呈现为错误页面,则应该能够将消息添加到
respond()
调用中包含的
模型中,并在错误页面上显示该消息(至少,我认为是这样)。

通常,来自控制器的响应会以内容和状态进行响应(默认成功)。每个链接的状态代码是一个整数值。这是您通常使用任何状态代码发送任何内容的方式-然后客户端(无论是浏览器还是另一个使用http客户端的服务器)将读取响应和状态,并根据状态对响应执行某些操作没有帮助,我理解您的意思,但我的问题是,我的客户机接收到的响应具有正确的状态代码和自定义json,但客户机没有响应的详细消息,我在客户端的日志中看到:wslite.rest.RESTClientException:401 null,其中null是grails未设置的响应详细消息,我不喜欢在日志中使用此null值。
status:Errors.INTERNAL\u SERVER\u ERROR
这似乎是定制的内部内容-这是否解析为整数401response.SC_未经授权?不要认为任何远程用户在发送代码时不知道代码映射到了什么,就会得到很大帮助——所有http客户机的原理都是一样的,都是基于错误代码来执行用户定义的操作。你能试试吗
response status:response.SC\u UNAUTHORIZED,text:'some error message'
看看这是怎么引起这个问题的,Errors.INTERNAL\u SERVER\u error只是代码整数的一个常量,我编辑了这个问题,因为我认为它不相关。响应状态需要整数代码
String errorMessage = "Whatever Internal Server Error"
response.addHeader("custom-error", errorMessage)
response.sendError(500, errorMessage)