【问题标题】:Setting setChunkedStreamingMode in HttpURLConnection fails to deliver data to server在 HttpURLConnection 中设置 setChunkedStreamingMode 无法将数据传递到服务器
【发布时间】:2023-03-19 21:59:01
【问题描述】:

我的开发机器上的服务器版本如下:

Apache/2.2.21 (Win32) mod_fcgid/2.3.6

我一直在测试HttpURLConnection,因为我的项目需要简单的流媒体功能。我已经阅读了来自 @BalusC 关于如何使用该类的精彩概要。

Using java.net.URLConnection to fire and handle HTTP requests

我目前遇到的问题是设置setChunkedStreamingMode 时。无论我将它设置为什么,我的流似乎都没有进入服务器,当我的服务器 api 方法/连接被调用/建立时,数据流是空的。但是,如果我删除它,它可以正常工作。

我见过另一个人有类似的问题:

Java/Android HttpURLConnection setChunkedStreamingMode not working with all PHP servers

但没有真正的解决方案。我无法将其设置为 setFixedLengthStreamingMode 仅仅是因为内容 (json) 的长度可变。

这不行。我可能会传输大量数据,因此无法将数据存储在内存中。

我的问题是,我怎样才能让 setChunkedStreamingMode 玩得更好?是服务器设置问题还是可以在代码中修复?

编辑 我现在已经在我的生产服务器上测试了我的代码,它没有问题。但是,我仍然想知道为什么我的本地机器上的 Apache 服务器会失败。任何帮助仍然非常感谢。

【问题讨论】:

  • 定义“似乎没有成功”。
  • @EJP 你说得对,这确实是一个糟糕的措辞。事实上,它确实到达了服务器,但是,没有任何数据。与删除 setChunkedStreamingMode 相比,我的数据通过了。据我所知,也没有错误。
  • 谢谢,现在定义“数据流为空”。怎么衡量的?
  • @EJP 我使用 php 读取输入:file_get_contents("php://input") 据我所知,没有输入。
  • 什么版本的 PHP?我发现这个:“5.3.0 之前的 PHP 没有实现分块传输解码”。另外你需要在 php.ini 中有protocol_version=1.1,默认是 HTTP 1.0。来源here

标签: java android apache httpurlconnection


【解决方案1】:

尝试添加此 HTTP 标头:

urlConnection.setRequestHeader("Transfer-Encoding","chunked");

我遇到了这样的问题:虽然我设置了分块的 HTTP 流模式(urlConnection.setChunkedStreamingMode(0)),但它不起作用,但是将 HTTP 标头放在它上面可以正常工作。

【讨论】:

  • 感谢回复,这个和设置setChunkedStreamingMode的效果一样。没有接收到数据。确实很奇怪。我也已经尝试过了。另外我认为你的答案应该是:urlConnection.setRequestProperty("Transfer-Encoding", "chunked").
  • 很难相信你所描述的真的解决了你的问题。 HttpURLConnection 在必要时自行设置标头。
【解决方案2】:

我遇到了类似的问题。在我的情况下,它是安装了病毒扫描程序的客户端系统。这些扫描仪有时具有身份盗用模块,可以拦截POSTs,扫描尸体然后将其传递出去。

在我的情况下,BitDefender 在传递之前缓存了大约 5MB。

如果整个有效负载较小,则 POST 将作为非分块固定长度请求传递。

【讨论】:

    【解决方案3】:

    我在使用HttpURLConnection 时遇到了类似的问题。只需添加:

    conn.setRequestProperty("connection", "close"); // disables Keep Alive
    

    到您的连接或为所有连接禁用它:

    System.setProperty("http.keepAlive", "false");
    

    来自关于disconnect()的API:

    释放此连接,以便其资源可以重复使用或关闭。 与其他 Java 实现不同,这不一定会关闭可重用的套接字连接。您可以通过在发出任何 HTTP 请求之前将 http.keepAlive 系统属性设置为 false 来禁用所有连接重用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多