【问题标题】:Getting "411 Length Required" after a PUT request from HTTP Client在来自 HTTP 客户端的 PUT 请求后获取“需要 411 长度”
【发布时间】:2013-03-15 05:09:34
【问题描述】:

我正在开发一个实现 HTTP 客户端的 Java 程序。 我测试它向服务器发送请求。 GET、POST 和 DELETE 请求工作正常。 例如,在一个 POST 请求之后,我得到一个输出

Data extracted:
{"status":{"message":"ok"}}

并且数据库会反映所做的更改。

在 PUT 请求之后,我得到以下网页的 html 标记,指示错误。

Data extracted:
<html>
<head><title>411 Length Required</title></head>
<body bgcolor="white">
<center><h1>411 Length Required</h1></center>
<hr><center>nginx/1.2.6</center>
</body>
</html>

因此数据库中没有任何变化。

我发现这可能与 Content-Length 标头有关,但我不确定。 尝试添加此标头后,我的程序等待一分钟,然后引发异常,通知它无法处理服务器响应。

如果需要,我还可以提供任何代码或堆栈跟踪。

【问题讨论】:

  • 所以setHeader("Content-Length", "" + file.length()) resp。 setContentLength((int)file.length()); 左右。
  • 我不想上传文件。只是尝试传递带有一堆参数的 URL 以更新数据库
  • 内容长度 0 正如@Sachin 所说的那样。
  • 谷歌应用引擎码头在本地运行时遇到了类似的问题。对我来说,单独设置 Content-Length 不起作用(我遇到了同样的 411 错误),所以我必须在请求上设置一个虚拟内容才能使其工作。

标签: java http rest put content-length


【解决方案1】:

是的,与Content-Length 相关的问题。 HTTP 错误 411 表示

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

因此,当您在 POST/PUT 方法中发送空的RequestBody 时,您还需要发送Content-Length:0。因此,在您的请求中添加此标头。我不认为这个标头会导致您添加到请求对象中的问题。

【讨论】:

  • 我也试过了,在这种情况下我得到的是Data extracted: {"status":{"message":"Content type 'application/octet-stream' not supported"}},但数据库仍然没有变化
  • 这是另一个与 Content-type 有关的问题。您的服务器可能未报告正确的 mime 类型或不支持此内容类型
  • 我联系了服务器,他们告诉我他们测试了相同的 PUT 请求,并且它适用于他们的 HTTP 客户端实现。问题是我使用了一个专用的 Java ME 平台,并且我认为我的 HTTP 客户端版本中存在错误。我无法理解的是它如何与 POST 一起使用?
  • 尝试从成功发出请求的人那里获取Content-Type Header 值。我认为这只是您请求中 Header 值的一个简单错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多