如何在请求正文中通过 RestTemplate 发布 xml 数据



我正在使用RestTemplate来执行URL。url 采用 XML 格式的输入参数。

我有一个这样的 XML,它作为字符串存储在变量xmlData我需要将此字符串传递给client_data变量中的 url -

<?xml version="1.0"?>
<ClientData
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.google.com model.xsd" 
 xmlns="http://www.google.com"> 
    <client id="100">
        <clock>
                <for>
                    <etc>val(tery) = 1</etc>
                    <while><![CDATA[val(tery)  < 20]]></while>
                </for>
        </clock>
    </model>
</ClientData>

以下是我的代码 -

String xmlData = getXMLData(); // this will return me above XML data as it is in String format
String url = generateURL(xmlData);
// but this line is returning me bad request always in exception
String response = restTemplate.getForObject(url, String.class);

以下是我的url生成后的外观,RestTemplate根据我的理解在内部进行 URL 编码,那么为什么我仍然看到错误的请求?

http://localhost:8080/test_tmp?client_data=<?xml version="1.0"?>
<ClientData
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.google.com model.xsd" 
 xmlns="http://www.google.com"> 
    <client id="100">
        <clock>
                <for>
                    <etc>val(tery) = 1</etc>
                    <while><![CDATA[val(tery)  < 20]]></while>
                </for>
        </clock>
    </model>
</ClientData>

如果我手动对 url 编码 XML 字符串并通过浏览器点击 url,那么它可以正常工作。我在这里做错了什么?

问题是 RestTemplate 正在执行 url 编码,这导致了问题。接受 URL 作为字符串的方法假定它未编码,因此它会为您编码。您可以在此处检查变体:使用 URI。预感是它正在将您的端点编码为无法访问的端点。

我们需要做的是防止它自动编码。我们可以通过使用采用 URI 而不是 url 字符串的方法来实现这一点。

下面的示例显示了我们如何对 XML 数据字符串进行编码并使用 RestTemplate 传递它,而不允许 RestTemplate 进行编码:

    StringBuilder builder = new StringBuilder();
    builder.append("http://localhost:8080/test_tmp");
    builder.append("?max_time=30&users=1000&client_data=");
    builder.append(URLEncoder.encode(xmlData));
    URI uri = URI.create(builder.toString());
    restTemplate.getForObject(uri, String.class);

最新更新