【问题标题】:How to configure HTTPServer to use content length and not transfer encoding: chunked?如何将 HTTPServer 配置为使用内容长度而不是传输编码:分块?
【发布时间】:2011-10-18 13:58:09
【问题描述】:

我将 java 的 HTTP Server 对象与 WebServiceProvider 实现的 Web 服务一起使用。 我看到无论客户请求如何,答案都是分块的,我需要它具有内容长度。 所以我假设问题出在服务器上,而不是 Web 服务器提供商,对吧? 以及如何配置 http 标头以使用内容长度而不是分块?

    HttpServer m_server = HttpServer.create();
    Endpoint ep= Endpoint.create(new ep());
    HttpContext epContext = m_server.createContext("/DownloadFile");
    ep.publish(downloadFileContext);

【问题讨论】:

    标签: java content-length chunked com.sun.net.httpserver


    【解决方案1】:

    我假设您说的是com.sun.net.httpserver HTTPServer。我进一步假设您通过调用Endpoint.publish 将服务器连接到服务,使用一些支持HTTPServer 的服务提供者。

    关键在HttpExchange.sendResponseHeaders方法中:

    如果响应长度参数大于零,则指定要发送的确切字节数,并且应用程序必须发送该确切数据量。如果响应长度参数为零,则使用分块传输编码并且可以发送任意数量的数据。应用程序通过关闭 OutputStream 来终止响应正文。

    因此,只要处理程序为responseLength 传递正值,就会使用 Content-Length。当然,要做到这一点,它必须提前知道要发送多少数据,而这很可能不会。恐怕它是否完全取决于绑定的实现。我不相信这是标准化的——事实上,我根本不相信 WebServiceProvider/HTTPServer 是标准化的。

    但是,即使您的提供者不合作,您也有办法:编写一个添加缓冲的Filter,并将其添加到您用于发布服务的 HttpContext 中。我认为要做到这一点,您必须编写 HttpExchange 的实现,它缓冲写入它的数据,将其传递到过滤器链以便处理程序写入其响应,然后当它返回时,写入缓冲的内容,设置responseLength

    【讨论】:

    • 嗨。听起来不错,但是我有 Web 服务,它们作为与端点相关的发布,因此服务器上有一些上下文,所以我实际上并没有通过服务器本身管理任何响应,响应是从 Web 服务发送的。
    • @Sophie:我不明白,抱歉。您是说您不控制将 Web 服务发布到 HTTPServer 的代码吗?您能否编辑您的问题,详细说明您的代码是如何工作的,以及您可以更改哪些部分?
    • 我添加了一个代码示例。 “ep”是我拥有的网络服务。所以当客户端执行ip_add/DownloadFile 时,它会转到我的网络服务。我也知道要发送的数据的长度。
    • 我明白了(虽然我假设“downloadFileContext”应该是“epContext”)。遗憾的是,虽然您可能知道响应的长度,但 Web 服务绑定却不知道,它是与 HttpExchange 交互的绑定。但是因为您可以访问 HttpContext,所以您可以编写一个过滤器来缓冲输出,就像我解释的那样,并将其添加到上下文中 (epContext.getFilters().add(new BufferingFilter()))。或者,您可以编写一个过滤器来设置响应长度并且不进行缓冲,但是如果您对长度有误会导致错误,这是有风险的。
    • 我成功地从 WebServiceContext 中获取了 httpExchnage 并在其上调用了 HttpExchange.sendResponseHeaders。所以现在我在 HTTP 消息中看到了 Content-Length,但客户端没有收到消息本身 - 没有发送有效负载。有什么想法我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2011-03-19
    • 2015-05-20
    • 2019-03-30
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多