当尝试使用HttpURLConnection进行post请求时,消息中白色被'+'替换,并且'='被添加到String的末尾。我使用的是JDK 1.8.0_91,以下是我的代码:
public void sendPost(String message) throws Exception {
String url = "http://localhost:8081/subscribe";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("POST");
/*String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345";*/
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(message);
wr.flush();
wr.close();
}
sendPost(“Say Hi”)将在服务器端给予:说+嗨=
2条答案
按热度按时间d5vmydt91#
如果不设置
Content-Type
请求头(使用setRequestProperty()
),则默认为application/x-www-form-urlencoded
。当POST请求的内容类型为
application/x-www-form-urlencoded
时,可以使用ServletRequest.getParameter
方法从请求体中提取参数。这会消耗请求体,因此任何后续对getInputStream()
或getReader()
的调用都将返回null。当您的Spring处理程序方法请求带有
@RequestBody
annotation的请求主体,并且主体已经被使用时,Spring将从参数重新构建主体,以便提供方法参数当Spring从解析的参数中重建请求体时,它将根据application/x-www-form-urlencoded
内容类型的要求对它们进行URL编码。此编码将空格转换为+
。带有
Say Hi
的原始请求体被解析为带有值""
的参数"Say Hi"
(没有=
的参数具有空值)。当按照application/x-www-form-urlencoded
重建时,参数被编码为Say+Hi=
,这就是您所看到的。这只会发生在
ServletRequest.getParameter
方法之一被调用的情况下,所以你可能有一个Filter
来做这件事。如果这个过滤器被删除,请求体就不会被消费,@RequestBody
参数会收到原始的请求体。另一种防止问题的方法是将请求体作为
text/plain
内容类型发送,因为这似乎是您想要的方式,即请求体实际上不是x-www-form-urlencoded
:当然,如果请求体确实是
x-www-form-urlencoded
内容,就像您的注解代码所建议的那样,那么就不应该有任何空格,并且一开始就没有问题。**总结一下:**您的问题是您在POST正文中发送了任意文本,但您没有设置内容类型,因此默认为
application/x-www-form-urlencoded
,并且您的内容不符合该内容类型的规范,即您的请求格式错误且行为不可预测。bmp9r5qi2#
我也面临着同样的情况。我在后端有一个小代码块,我试图发送一个像'Ekin Frontend'的字符串,它在后端转换为'Ekin+Frontend='。
这是我的代码块;