Rest API中使用最多的参数类型是Json和xml,而在之前的项目一直接触的也是Json,实际上我也认为Json更简洁更直观。但是最近导师和某研究院签了一个合作项目,对方的前端使用的是xml,所以我也跟着查找了一下java对象与xml的转换方法。
Servlet是自带json和xml两种返回格式的,在Get时返回xml非常简单,使用annotation指定xml即可。
GET
1 2 3 4 5
| @Get("xml") public Object handleGetRequest() { log.debug("received a Get Request"); return new Order("id123","user1",new Date(),"scan"); }
|
返回为:
1 2 3 4 5 6
| <Order> <id>id123</id> <userName>user1</userName> <date>1431707038879</date> <service>scan</service> </Order>
|
是的,直接返回对象就可以的,servlet能自动完成xml的生成。
POST
POST时传入的参数是xml格式的字符串,最理想的状态是自动转换为Object,而不需要自己获取对应字段的值再构造对象。而JAXB刚好可以做到这一点。
为了使用自动转换,在定义对应的类时,也需要使用annotation.
其中Order类的部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @XmlRootElement(name="Order") public class Order { private String id; private String userName; private Date date; private String service; public String getId() { return id; } @XmlElement public void setId(String id) { this.id = id; } public String getUserName() { return userName; } @XmlElement public void setUserName(String userName) { this.userName = userName; }
|
转换过程
1 2 3 4 5 6
| @Post public String handlePostRequest(String fmXml) throws JAXBException { log.info("received post data : {}",fmXml); JAXBContext jaxbContext = JAXBContext.newInstance(Order.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Order order = (Order) jaxbUnmarshaller.unmarshal(new StringReader(fmXml));
|
和Get一样,POST也会有返回信息,这里我们可以使用显式的转换,依然返回order:
1 2 3 4 5 6 7 8
| JAXBContext context = JAXBContext.newInstance(Order.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter stringWriter = new StringWriter(); m.marshal(order,stringWriter); return stringWriter.toString();
|
需要导入的类:
1 2 3 4 5 6 7 8
| import org.restlet.resource.Get; import org.restlet.resource.Post; import org.restlet.resource.ServerResource; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller;
|
输出
使用POSTMAN测试 :