【问题标题】:Java, HttpURLConnection and setting the content lengthJava、HttpURLConnection 和设置内容长度
【发布时间】:2011-10-27 02:26:28
【问题描述】:

我正在为 PUT 设置 HttpURLConnection 中内容的长度。

urlConnection.setRequestProperty("Content-Length", "" + responseJSONArray.toString(2).getBytes("UTF8").length);

实际字节数为 74。但是,当我查询 urlConnection 的内容长度时,我返回了 -1。这是为什么?为什么长度不相等(鉴于我设置了这个)?

我必须设置内容长度,因为我收到了来自服务器的 411 响应。

(另外,在太阳examples 中,我看到setRequestProperty 的第二个参数是int 而不是String,这看起来很奇怪。)

【问题讨论】:

  • 我回答了这个问题,现在我意识到它有一个 android 标签。我不知道谷歌是如何实现HttpURLConnection的。
  • @The Elite Gentleman 他们必须同意现有的 Javadoc 规范,而您的误解与实现之间可能存在的差异无关。

标签: java android httpurlconnection content-length


【解决方案1】:

您不应该自己设置此标头。使用setFixedLengthStreamingMode() 或setChunkedTransferMode()。

【讨论】:

  • 谢谢。我仍然不明白一些事情:我现在正在做urlConnection.setFixedLengthStreamingMode(responseJSONArray.toString(2).getBytes("UTF8").length);。正文长度为74 字节,但是当我调用Log.v("app", "" + urlConnection.getContentLength()); 时,我看到-1。这是为什么呢?
  • @SK9 这是响应的长度。
  • 谢谢。这对我来说似乎是不必要的模棱两可!
  • @SK9 对此毫不含糊。 Javadoc 中没有提及请求的内容长度。一切都与回应有关。
  • @SK9 当然可以,但你问的是getContentLength(),,这就是我的回答。
【解决方案2】:

也不要忘记添加setDoOutput 来告诉您的连接您将要发送数据。

【讨论】:

  • 谢谢。我已经是(urlConnection.setDoOutput(true);)。
  • 它应该是-1,因为您发送的数据没有从服务器获取一些数据。 getContentLenght():“返回由响应头字段 content-length 指定的内容长度(以字节为单位),如果未设置此字段,则返回 -1。”来自Android Javadoc for HttpURLConnection
  • 嗯 - 我以为 content-length 字段指定了我正在准备的 HTTP 请求的字节长度。
  • 什么应该是-1?问题是关于请求内容长度的。您的报价是关于响应内容长度的。你的评论没有意义。
【解决方案3】:

“内容长度”出现同样的错误 -

        URL url = new URL(targetURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "text/plain");
        connection.setRequestProperty("Authorization", authKey);
        connection.setRequestProperty("Content-Length", Integer.toString(requestJSON.getBytes().length));

我最终推断出这是因为其中一个 Json 对象字段包含变音字符。

        someCategory = "Ţepuşă";
        try {
        JSONObject postData = new JSONObject();
        postData.put("category", someCategory);
        .....

这就是错误的样子:

08-27 18:57:07.842 24263-24263/ro.nexuserp.documentecontabile E/Eror: content-length promised 491001 bytes, but received 491000

【讨论】:

  • 错误是你根本不应该设置它。 Java 会为您设置它。这在您发帖前 8 年曾多次声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多