提问者:小点点

分块编码的HTTP标头POST-错误411


我正在使用Arduino将数据发送到服务器,这需要逐行构建超文本标记语言POST。我不一定事先知道内容长度,所以我使用“分块”编码。

当我使用rfc2616中指定的“传输编码”选项尝试来自维基百科的这个示例帖子时

client.println("POST /myurl HTTP/1.1");
client.println("Host: 12.345.679.999"); // replaced with the test server's IP
client.println("User-Agent: Arduino/1.0");
client.println("Transfer-Encoding: chunked");
client.println();  
client.println("4");
client.println("test");
client.println("0");
client.println();

或者,显式使用转义字符:

client.print("4\r\ntest\r\n0\r\n\r\n");

我从服务器收到错误:

HTTP/1.1 411 Length Required
A request of the requested method POST requires a valid Content-length.
Server: Apache/2.2.22 (Ubuntu)

但是,“分块”编码不应该需要Content-Llong标头字段,请参阅rfc2616中的4.4-消息长度

我错过了什么吗?为什么这个电话不起作用?

郑重声明,非分块编码的工作原理:

if(client.connect(server, 80)){
    String PostData = "test";
    Serial.println("POST /myurl HTTP/1.1");
    client.println("Host: 12.345.679.999"); // replaced with the test server's IP
    Serial.println("User-Agent: Arduino/1.0");
    Serial.print("Content-Length: ");
    Serial.println(PostData.length());
    Serial.println();
    Serial.println(PostData);
}

来自apache2 error. log:“分块传输-禁止编码”


共1个答案

匿名用户

找到之后

chunked Transfer-Encoding forbidden

在我的Apache2日志中,我得出结论,错误不在我所做的POST中。

我发现modwsgi(apache和django之间的中间层)默认不启用分块传输编码。过去,根本不支持分块

参考新版本modwsgi中的change日志,我发现编写

WSGIChunkedRequest On

在我的apachehttpd. conf文件中允许分块请求(不再有411错误)