如何正确地发送一个HTTP消息给客户端(How to properly send an HTTP m

2019-07-29 21:09发布

我工作在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