Java HttpURLConnection:内容长度计算

时间:2011-06-15 08:21:58

标签: java http rest httpurlconnection urlconnection

我正在为bitbucket开发一个用于发布RESTful API的库。我取得了很好的进展,现在我要解决需要HTTP PUT请求的Updating an Issue部分。

现在我因为HTTP错误代码411 Length Required而陷入困境。经过一番谷歌搜索后,我发现了以下code example

// CORRECT: get a UTF-8 encoded byte array from the response
// String and set the content-length to the length of the
// resulting byte array.
String response = [insert XML with UTF-8 characters here];
byte[] responseBytes;
try {
    responseBytes = response.getBytes("UTF-8");
}
catch ( UnsupportedEncodingException e ) {
    System.err.print("My computer hates UTF-8");
}

this.contentLength_ = responseBytes.length;

现在我的问题:究竟测量了什么?

  • 查询字符串
  • urlencoded查询字符串
  • 只有参数的值...... ??

connection.setRequestProperty("Content-Length", String.valueOf(<mycomputedInt>));是一种设置内容长度属性的适当方法吗?

赞赏的例子。提前谢谢。


编辑:

例如,您可以使用bitbucket wiki条目中的以下curl示例来解释计算:

curl -X PUT -d "content=Updated%20Content" \
https://api.bitbucket.org/1.0/repositories/sarahmaddox/sarahmaddox/issues/1/

2 个答案:

答案 0 :(得分:6)

你正在做请求,对吧。 content-length是请求正文的字节数。在你的情况下

int content-length = "content=Updated%20Content".getBytes("UTF-8").length;

究竟测量了什么?

url编码的查询字符串(在请求/实体主体中时)

答案 1 :(得分:4)

411上的HTTP规范:

  

服务器拒绝接受   没有定义内容的请求 -   长度。客户可以重复   请求是否添加有效   Content-Length头字段包含   消息体的长度   请求消息。

Content-Length header上的HTTP规范:

  

Content-Length实体标题字段   表示实体主体的大小,   以十进制数字表示的OCTET

HTTP entity length上的HTTP规范:

entity-body := Content-Encoding( Content-Type( data ) )
  

消息的实体长度是   消息体的长度在任何之前   转移编码已经应用。


总结一下,如果要发送未压缩的UTF-8字符串,您将确定要发送的字节为:

Identity( UTF-8( "content=Updated%20Content" ) )

Content-Length设置为输出的字节数。

如果您要发送UTF-8数据,我强烈建议您设置Content-Type标题。