Tôi định gửi một thông báo XML bằng cách sử dụng Spring Rest Template. Sau một số lỗi, tôi bắt đầu nghi ngờ liệu Spring Rest Template có thể POST một thông điệp XML hay không. Đây là một khách hàng Restful mà tôi đã phát triển. Các RestTemplate được thiết kế để làm một bài HTTP của một XML để một webservice RESTful:Cách POST XML bằng cách sử dụng RestTemplate
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);
}
}
điều khiển này được thiết kế để sử dụng tin nhắn XML. Bộ điều khiển được viết để kiểm tra xem khách hàng có thể gửi tin nhắn XML một cách thích hợp:
@RequestMapping("/")
@Controller
public class HomeController {
@RequestMapping(value = "/restCallConsumer", method = RequestMethod.POST)
public String restCallConsumer(String anXML) {
System.out.println("anXML: " + anXML);
return "aView";
}
}
Hầu hết các ví dụ tôi tìm thấy xung quanh sử dụng XML với RestTemplate liên quan đến việc sử dụng một công cụ lập bản đồ đối tượng. Công cụ này ánh xạ đối tượng tới một XML và ngược lại. Trong trường hợp của tôi, tôi chỉ có một chuỗi XML mà tôi muốn gửi qua bài đăng HTTP. Có ai hoàn thành những gì tôi đang cố gắng làm không? Nó có thể là RestFul khách hàng không dành cho những gì tôi đang cố gắng để làm. Bất kỳ câu trả lời sẽ được đánh giá cao :)
EDIT nhắn
XML được sản xuất bởi serializing một bản đồ sử dụng xStream. Đây là mã thực hiện điều đó:
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);
Mã này nhằm chuyển đổi đa thành chuỗi XML bằng trình chuyển đổi có tên MapEntryConverter. Đây là mã cho chuyển đổi:
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();
}
}
}
EDIT
tôi thay đổi mã của tôi theo @artbristol khuyến khích. Tôi thấy điều này trong file log:
DEBUG: org.springframework.web.client.RestTemplate - Viết [] sử dụng [[email protected]34263a]
Dường như restTemplate đang POST-ing thông điệp XML. Tuy nhiên, tham số anXML trong bộ điều khiển là null. Điều này có nghĩa là thông điệp XML không thể tới được bộ điều khiển? Nó có thể được rằng bộ điều khiển không được thực hiện một cách chính xác?
Tôi có thể biết lý do bạn mong đợi nó trong trường anXMLMessage không? Hãy thử http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy
@Rudy bản thân thông điệp XML sẽ được tạo ra bằng cách nối tiếp Bản đồ bằng XStream. Tôi sẽ thêm thông tin đó vào câu hỏi của mình. Cảm ơn bạn đã liên kết :) – zfranciscus