Java writeBytes将空格替换为'+'

时间:2016-12-22 23:24:16

标签: java web-services spring-mvc spring-boot

当尝试使用HttpURLConnection进行发布请求时,消息中的空格被'+'替换,并且在String的末尾添加了'='。 我使用的是JDK 1.8.0_91,这是我的代码:

undef

sendPost(“Say Hi”)将在服务器端给出:Say + Hi =

1 个答案:

答案 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} },并且您的内容不符合该内容类型的规范,即您的请求格式错误且行为不可预测。