Contents
  1. 1. GET
  2. 2. POST

  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测试 :

Contents
  1. 1. GET
  2. 2. POST