当尝试使用HttpURLConnection进行发布请求时,消息中的空格被'+'替换,并且在String的末尾添加了'='。 我使用的是JDK 1.8.0_91,这是我的代码:
undef
sendPost(“Say Hi”)将在服务器端给出:Say + Hi =
答案 0 :(得分:-1)
如果您未设置Content-Type
请求标头(使用setRequestProperty()
),则默认为application/x-www-form-urlencoded
。
当POST请求的内容类型为application/x-www-form-urlencoded
时,ServletRequest.getParameter
方法可用于从请求正文中提取参数。此会消耗请求正文,因此对getInputStream()
或getReader()
的任何后续调用都将返回null。
当你的Spring处理程序方法请求带有@RequestBody
注释的请求体,并且正文已被消耗时,Spring将从参数重建正文,以便提供方法参数(它基本上是假装)。当Spring从解析的参数重建请求主体时,它将根据application/x-www-form-urlencoded
内容类型的要求对它们进行URL编码。此编码将空格转换为+
。
原始请求正文Say Hi
被解析为参数"Say Hi"
,其值为""
(不含=
的参数为空值)。根据{{1}}重建后,参数将被编码为application/x-www-form-urlencoded
,这是您所看到的。
只有在调用了Say+Hi=
个方法之一时才会发生这种情况,因此您可能会有ServletRequest.getParameter
这样做。如果删除了该过滤器,则请求正文将不会被使用,Filter
参数将收到原始请求正文。
另一种防止问题的方法是将请求正文作为@RequestBody
内容类型发送,因为这似乎是您想要的方式,即请求正文实际上不是text/plain
:< / p>
x-www-form-urlencoded
当然,如果请求正文是 con.setRequestProperty("Content-Type", "text/plain; charset=ISO-8859-1");
内容,就像您的评论代码所暗示的那样,那么就不应该 任何空格,开始没有问题。
回顾一下:您的问题是您在POST正文中发送了任意文字,但您没有设置内容类型,因此默认为{{1} },并且您的内容不符合该内容类型的规范,即您的请求格式错误且行为不可预测。