我工作在Java中RESTful Web服务。 我需要发送错误信息到客户端,如果事情是错的好方法。
根据Javadoc中 , HttpServletResponse.setStatus(int status, String message)
已过时“由于消息参数的意义暧昧”。
是否有设置状态信息或“首选方式原因短语的响应”? 该sendError(int, String)
方法不能做到这一点。
编辑:为了澄清,我想修改的HTTP状态行,即"HTTP/1.1 404 Not Found"
,而不是主体内容。 具体来说,我想送样应答"HTTP/1.1 400 Missing customerNumber parameter"
。
Answer 1:
我不认为任何RESTful客户端会希望看一下原因短语找出什么地方出了错; 大多数RESTful服务我见过/使用将发送标准的状态信息,并在响应的主体扩大的消息。 sendError(int, String)
是理想的情况。
Answer 2:
如果您正在使用Tomcat,请参见设置org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER:
http://tomcat.apache.org/tomcat-5.5-doc/config/systemprops.html
- 如果这是真实的自定义HTTP状态消息将HTTP头中使用。 用户必须确保任何这样的消息是ISO-8859-1编码,尤其是当用户提供的输入被包括在消息中,以防止可能的XSS弱点。 如果不指定将使用默认值false。
对原有的漏洞一些细节看到这个页面:
http://www.securityfocus.com/archive/1/archive/1/495021/100/0/threaded
Answer 3:
你的澄清后,我在Tomcat中尝试这样做。 执行
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "message goes here");
回报
HTTP/1.1 400 message goes here
如在响应中的第一行。
必须有与您正在使用的servlet容器有问题。
Answer 4:
我不是很熟悉周围REST的“最佳实践”。 但我知道这个概念是基于HTTP和它是如何应该自然地锻炼身体。 因此,如何利用身体内部的MIME类型和简单的文本应用程序错误,如“应用/ MYAPP的异常”和一些“喇嘛喇嘛”? 您可以为提供客户端库。
我不会用HTTP响应代码的应用程序错误。 因为我想知道什么是失败的:无论是我的应用程序或我的HTTP服务器。
(我希望,我会在这里看到一些最佳实践建议,也。)
Answer 5:
它真不明白你要完成的任务。 我首先想到的是sendError但你说你想要什么,不办......让你看着创建一组的“错误反应”,意为特定XML或JSON内容(或者任何你正在使用的传输语言),其包含错误消息或代码和任何其它有用的信息?
我不喜欢的东西,对于Spring的MVC基于RESTful服务了一段时间后,效果不错,但你必须非常捕获并处理每一个例外,避免了客户端得到一个通用的500消息什么的。 春季异常解析器工作的很好这一点。
希望这有助于...如果不是,也许你正在尝试什么多了几分清晰度来完成。 很抱歉,如果我被密集,缺少明显的东西。
Answer 6:
我认为sendError
应该这样做,但是你的应用服务器可以是失败...的IBM WebSphere 3.5失败对我在很久以前,而Tomcat的会传播消息就好了; 看到的JavaServer Pages(JSP)和JSTL -错误页面:保持头“HTTP / 1.x的400我的消息”? 在Sun论坛。
最后,我用以下解决方法,但这是一种JSP特定的,并且可能实际上是旧的:
<%@ page isErrorPage="true" %>
<%
// This attribute is NOT set when calling HttpResponse#setStatus and then
// explicitely incuding this error page using RequestDispatcher#include()
// So: only set by HttpResponse#sendError()
Integer origStatus =
(Integer)request.getAttribute("javax.servlet.error.status_code");
if(origStatus != null) {
String origMessage =
(String)request.getAttribute("javax.servlet.error.message");
if(origMessage != null) {
response.reset();
response.setContentType("text/html");
// deprecated, but works:
response.setStatus(origStatus.intValue(), origMessage);
// would yield recursive error:
// response.sendError(origStatus, origMessage);
}
}
%>
如果你碰巧使用Internet Explorer测试:禁用“显示友好HTTP错误信息”。 (如果不禁止的是,IE浏览器的HTML内容,如果不符合要求,将-or将-让IE显示它自己的错误消息,而不是一些最小长度的一些奇怪的要求,请参阅注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\ErrorThresholds
微软的超文本传输协议错误消息的说明 。)
Answer 7:
在动力弹簧的Web应用程序,Tomcat上运行我用下面bean:
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.springframework.beans.factory.InitializingBean;
public class SystemPropertiesInitializingBean implements InitializingBean {
private Map<String, String> systemProperties;
@Override
public void afterPropertiesSet() throws Exception {
if (null == systemProperties || systemProperties.isEmpty()) {
return;
}
final Set<Entry<String, String>> entrySet = systemProperties.entrySet();
for (final Entry<String, String> entry : entrySet) {
final String key = entry.getKey();
final String value = entry.getValue();
System.setProperty(key, value);
}
}
public void setSystemProperties(final Map<String, String> systemProperties) {
this.systemProperties = systemProperties;
}
}
而在applicationContext.xml中:
<bean class="....SystemPropertiesInitializingBean">
<property name="systemProperties">
<map>
<entry key="org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER" value="true"/>
</map>
</property>
</bean>
文章来源: How to properly send an HTTP message to the client