Java writeBytes白色替换为“+”

rseugnpd  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(161)

当尝试使用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”)将在服务器端给予:说+嗨=

d5vmydt9

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

con.setRequestProperty("Content-Type", "text/plain; charset=ISO-8859-1");

当然,如果请求体确实是x-www-form-urlencoded内容,就像您的注解代码所建议的那样,那么就不应该有任何空格,并且一开始就没有问题。

**总结一下:**您的问题是您在POST正文中发送了任意文本,但您没有设置内容类型,因此默认为application/x-www-form-urlencoded,并且您的内容不符合该内容类型的规范,即您的请求格式错误且行为不可预测。

bmp9r5qi

bmp9r5qi2#

我也面临着同样的情况。我在后端有一个小代码块,我试图发送一个像'Ekin Frontend'的字符串,它在后端转换为'Ekin+Frontend='。
这是我的代码块;

@PostMapping("/error")
public boolean addError( @RequestBody String errorMsg) {
    ...
}

相关问题