如何通过请求正文中的RestTemplate POST xml 数据?
How to POST xml data through RestTemplate in the body of request?
我正在使用 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 作为 String 的方法假定它没有被编码,因此它会为你编码。您可以在此处检查变体:Working with the 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);
我正在使用 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 作为 String 的方法假定它没有被编码,因此它会为你编码。您可以在此处检查变体:Working with the 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);