16

我正在使用Arduino 将数据发送到服务器,这需要逐行构建 HTML POST。我不一定知道 Content-Length a-priori,所以我使用“分块”编码。

当我尝试使用 rfc2616 中指定的“Transfer-Encoding”选项从 Wikipedia 尝试此示例帖子时

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-Length 标头字段,请参阅4.4 - rfc2616 中的消息长度

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

作为记录,非分块编码有效:

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:“禁止分块传输编码”

4

1 回答 1

12

找到后

chunked Transfer-Encoding forbidden

在我的 Apache2 日志中,我得出结论,错误不在我正在制作的 POST 中。

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

参考新版modwsgi中的change-log,发现写的是

WSGIChunkedRequest On

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

于 2013-06-22T23:44:44.493 回答