如何在 Grails 响应中添加状态消息
how to add a status message on a grails respond
我创建了一个方法,在每个未捕获的异常之后调用并响应 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",
])
grails 使用 Servlet API’s HttpServletResponse to build response.
现在检查 java 文档中的 HttpServletResponse class。
只有两种方法可以定义状态消息:
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,"custom status message" 功能将从版本 9 开始删除:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html#Other
但根据 RFC2616 sec 6.1.1 :此处列出的短语仅作为建议的原因 -- 它们可以被 替换为本地等效项而不影响协议。
这不会直接回答您的问题,并且可能无法解决您的问题,具体取决于您对收到错误的应用程序的控制程度,但您可以将错误消息添加到 header应该传递给客户端的响应(如果它知道检查它们)。
String errorMessage = "Whatever Internal Server Error"
response.addHeader("custom-error", errorMessage)
response.sendError(500, errorMessage)
这将在 header 中发送消息并作为响应消息...我不知道这是否适用于 respond()
或者它如何与 response
交互object 在控制器中......但是如果您响应将视图呈现为错误页面,您应该能够将消息添加到 respond()
调用中包含的 model
并在错误页面上显示(至少,我是这么认为的)。
我创建了一个方法,在每个未捕获的异常之后调用并响应 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",
])
grails 使用 Servlet API’s HttpServletResponse to build response.
现在检查 java 文档中的 HttpServletResponse class。
只有两种方法可以定义状态消息:
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,"custom status message" 功能将从版本 9 开始删除:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html#Other
但根据 RFC2616 sec 6.1.1 :此处列出的短语仅作为建议的原因 -- 它们可以被 替换为本地等效项而不影响协议。
这不会直接回答您的问题,并且可能无法解决您的问题,具体取决于您对收到错误的应用程序的控制程度,但您可以将错误消息添加到 header应该传递给客户端的响应(如果它知道检查它们)。
String errorMessage = "Whatever Internal Server Error"
response.addHeader("custom-error", errorMessage)
response.sendError(500, errorMessage)
这将在 header 中发送消息并作为响应消息...我不知道这是否适用于 respond()
或者它如何与 response
交互object 在控制器中......但是如果您响应将视图呈现为错误页面,您应该能够将消息添加到 respond()
调用中包含的 model
并在错误页面上显示(至少,我是这么认为的)。