代码示例:URL 映射
可以使用多种方式把 URL 映射到实现方法。比较先进的方法可能更灵活,应该用在比较大的应用程序中。这个小示例使用最简单的方法:正则表达式。下面是 BagServlet 上的 post 方法示例,它把 URL 参数传递给底层 servlet。可以在本文的下载文件中找到完整的 servlet 代码。注意,这里没有实现实际的底层服务。 以下是该示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Pattern pattern = Pattern.compile("^/?.*?/bags/(.*)/status/(.*)$");
Matcher matcher = pattern.matcher(request.getRequestURI());
if(matcher.matches()) {
String bagId = matcher.group(1);
String newStatus = matcher.group(2);
bagService.changeBagStatus(bagId, newStatus);
}
}
在调用这个 URL 时,如果成功,就会隐式地返回状态码 200。更有意义的是,代码返回 XML 结构。这个示例使用 XStream API 把 Java™ 对象转换成 XML 结构。这个 API 需要的配置非常少,而且主要根据类中的字段名选择元素名。
这个示例代码使用下面这些简单的类:
航班:
package eu.adraandejonge.restfulsoa;
public class Flight {
String id;
public Flight(String id) {
super();
this.id = id;
}
}
乘客:
package eu.adraandejonge.restfulsoa;
public class Traveller {
private String id;
public Traveller(String id) {
super();
this.id = id;
}
}
包裹:
package eu.adraandejonge.restfulsoa;
public class Bag {
private String id;
private Flight flight;
private Traveller traveller;
private String status;
public Bag(String id, Flight flight, Traveller traveller, String status) {
super();
this.id = id;
this.flight = flight;
this.traveller = traveller;
this.status = status;
}
}
假设底层的 BagService 返回一个包裹,包裹的航班 ID 是 1,乘客 ID 是 1,状态是 new。请考虑下面的 GET 实现:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Pattern pattern = Pattern.compile("^/?.*?/bags/(.*)$");
Matcher matcher = pattern.matcher(request.getRequestURI());
if (matcher.matches()) {
String bagId = matcher.group(1);
Bag bag = bagService.retrieveBag(bagId);
XStream xstream = new XStream();
xstream.alias("bag", Bag.class);
xstream.alias("traveller", Traveller.class);
xstream.alias("flight", Flight.class);
xstream.useAttributeFor(Bag.class, "id");
xstream.useAttributeFor(Traveller.class, "id");
xstream.useAttributeFor(Flight.class, "id");
String xml = xstream.toXML(bag);
response.getWriter().write(xml);
}
}
在查询这个 URL 时,它会返回以下信息:
new
还能做什么?
我选择这些示例代码是为了说明,不需要很多底层通信,URL 也能够实现很多功能。对于其他服务,可能需要处理上传给 REST 服务的 XML 结构。XStream 也可以帮助完成这个任务。例如,要想对包裹的 XML 结构进行去序列化,应该调用:
Bag bag = (Bag) xstream.fromXML(xml);