为什么我的请求返回不完整的多部分



我正在使用我的Arduino来执行一个多部分/表单数据请求。我完全由自己生成请求,如下所示:

client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));

client.print(F("Content-Type: multipart/form-data; "));
client.print(F("boundary="AaB03x"rn"));
client.print(F("Content-Length: "));
client.print(strlen("{json data here}") 
+ strlen("{json data here}"));
client.print("rnConnection: closern");
// First part 
// Boundary 
client.print(F("rn--AaB03xrn"));
// Headers
client.print(F("Content-Disposition: form-data; name="header"rn"));
client.print(F("Content-Type: application/ld+jsonrn"));
client.print(F("Content-Length: "));
client.print(strlen("{json data here}"));
client.print(F("rnrn"));
// Content 
client.print(F("{json data here}"));
// Second part 
// Boundary 
client.print(F("rn--AaB03xrn"));
// Headers
client.print(F("Content-Disposition: form-data; name="payload"rn"));
client.print(F("Content-Type: application/ld+jsonrn"));//
client.print(F("Content-Length: "));
client.print(strlen("{json data here}"));
client.print(F("rnrn"));
// Content 
client.print(F("{json data here}"));
// End of boundary 
client.print(F("rn--AaB03x--rnrn"));

然而,服务器返回"0";不完全多部分;我不明白,因为多部分看起来很好。我以为这可能是由于换行不正确,但我一直没能找到解决方案。

输出可以在下面看到,包括发送的请求以及来自服务器的响应。

GET /router HTTP/1.1
Host: 192.168.178.147
Content-Type: multipart/form-data; boundary="AaB03x"
Content-Length: 4363
Connection: close
--AaB03x
Content-Disposition: form-data; name="header"
Content-Type: application/ld+json
Content-Length: 4143
{
some data here
}
--AaB03x
Content-Disposition: form-data; name="payload"
Content-Type: application/ld+json
Content-Length: 220
{
some data here
}
--AaB03x--
connected to 192.168.178.147
HTTP/1.1 500 Server Error
Connection: close
Cache-Control: must-revalidate,no-cache,no-store
Content-Type: text/html;charset=iso-8859-1
Content-Length: 597
Server: Jetty(9.4.41.v20210516)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500 Server Error</h2>
<table>
<tr><th>URI:</th><td>/router</td></tr>
<tr><th>STATUS:</th><td>500</td></tr>
<tr><th>MESSAGE:</th><td>Server Error</td></tr>
<tr><th>SERVLET:</th><td>org.apache.camel.component.jetty.CamelContinuationServlet-38cb1606</td></tr>
<tr><th>CAUSED BY:</th><td>java.io.IOException: Incomplete Multipart</td></tr>
</table>
<hr><a href="https://eclipse.org/jetty">Powered by Jetty:// 9.4.41.v20210516</a><hr/>
</body>
</html>

您的Content-Length计算是可疑的。

删除multipart中每个子节的Content-Length标头,然后重试,multipart不需要这些标头,而且您的计算无论如何都是错误的。

您可以在Jetty测试中看到来自各种库和浏览器的各种多部分请求的捕获。

https://github.com/eclipse/jetty.project/tree/jetty-9.4.41.v20210516/jetty-http/src/test/resources/multipart

(看看以*.raw结尾的,通常可以在文本编辑器中打开(

提示:不要自己这么做,多部分的哑剧充满了边缘案例、陷阱和古老的把戏。获取apachehttpcomponents-httpmime-jar,然后使用它正确地生成原始mime-multipart部分。

  • 工件-https://search.maven.org/artifact/org.apache.httpcomponents/httpmime
  • Javadoc-https://javadoc.io/doc/org.apache.httpcomponents/httpmime/latest/index.html

相关内容

  • 没有找到相关文章

最新更新