8

我目前正在为 bitbucket 问题 RESTful API 开发一个库。我取得了不错的进展,现在我将处理需要 HTTP PUT 请求的更新问题部分。

现在我被困住了,因为 HTTP Error Code 411 Length Required。经过一番谷歌搜索,我找到了以下代码示例

// 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/
4

2 回答 2

8

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

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

什么是精确测量的?

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

于 2011-06-15T09:03:11.453 回答
4

411上的 HTTP 规范:

服务器拒绝接受没有定义 Content-Length 的请求。如果客户端在请求消息中添加了包含消息体长度的有效 Content-Length 头字段,则客户端可以重复请求。

Content-Length 标头的 HTTP 规范:

Content-Length entity-header字段表示entity-body的大小,以OCTET的十进制数表示

关于HTTP 实体长度的 HTTP 规范:

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

消息的实体长度是在应用任何传输编码之前消息正文的长度。


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

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

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

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

于 2011-06-15T09:04:23.527 回答