gpt4 book ai didi

java - 如何使用 RestTemplate 发布 XML

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:41 25 4
gpt4 key购买 nike

我打算使用 Spring Rest 模板发布 XML 消息。在多次失败之后,我开始怀疑 Spring Rest Template 是否可以 POST XML 消息。这是我开发的一个 Restful 客户端。 RestTemplate 旨在将 XML 的 HTTP post 发送到 RestFul web 服务:

 Class RestClient{
public static void main(String[] args) {

RestTemplate restTemplate = new RestTemplate();


List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();

//This JAXB Message converter is intended to marshal an XML message over HTTP.
//However, I find this converter is not doing the intended function.

Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.TEXT_HTML);
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(jaxbMessageConverter);
restTemplate.setMessageConverters(messageConverters);
restTemplate.postForLocation("http://localhost:8080/RecipeProject/restCallConsumer", "<add><somefield></somefield></add>",String.class);
}

此 Controller 旨在使用 XML 消息。编写 Controller 是为了测试客户端是否可以适本地发送 XML 消息:

@RequestMapping("/")
@Controller
public class HomeController {
@RequestMapping(value = "/restCallConsumer", method = RequestMethod.POST)
public String restCallConsumer(String anXML) {
System.out.println("anXML: " + anXML);
return "aView";
}
}

我在将 XML 与 RestTemplate 结合使用时发现的大多数示例都涉及使用对象映射工具。此工具将对象映射到 XML,反之亦然。在我的例子中,我只有一个要通过 HTTP post 发送的 XML 字符串。有没有人完成我想做的事?可能是 RestFul 客户端不适用于我正在尝试做的事情。任何答案将不胜感激:)

编辑

XML 消息是通过使用 Xstream 序列化 Map 生成的。这是执行此操作的代码:

    com.google.common.collect.LinkedListMultimap.ListMultimap<String, String> multimap = com.google.common.collect.LinkedListMultimap.LinkedListMultimap.create();
multimap.put("x", "1");
multimap.put("x", "2");
multimap.put("y", "3");

XStream xStream = new XStream(new DomDriver());
xStream.registerConverter(new MapEntryConverter(xStream.getMapper()));

xStream.alias("add", multimap.getClass());
String xml = xStream.toXML(multimap);
System.out.println(xml);

此代码旨在使用名为 MapEntryConverter 的转换器将多图转换为 XML 字符串。这是转换器的代码:

public static class MapEntryConverter extends MapConverter {

public MapEntryConverter(Mapper mapper) {
super(mapper);
}

public boolean canConvert(Class clazz) {
return ListMultimap.class.isAssignableFrom(clazz);
}

public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {

ListMultimap<String, String> map = (ListMultimap<String, String>) value;
for (String key : map.keys()) {
writer.startNode(key);
writer.setValue(map.get(key).get(0));
writer.endNode();
}
}

}

编辑

我按照@artbristol 的建议更改我的代码。我在日志文件中看到了这个:

调试:org.springframework.web.client.RestTemplate - 编写[ 1个 1个 3个] 使用 [org.springframework.http.converter.StringHttpMessageConverter@1d34263a]

看起来 restTemplate 正在 POST-ing XML 消息。但是, Controller 中的 anXML 参数为空。这是否意味着 XML 消息无法到达 Controller ?会不会是 Controller 没有正确实现?

最佳答案

您不需要使用 Spring 的 JAXB 编码消息转换器 - 您已经通过将其变成 String 来完成这项工作。只需发布 String (就像在您的代码中一样)应该可以工作(但是丢失 String.class 参数,这是用于 URL 变量,并摆脱 setMessageConverters 调用,因为这会阻止默认的 StringHttpMessageConverter 工作。

关于java - 如何使用 RestTemplate 发布 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com