我已经开发了REST服务,但现在我意识到我做错了什么。
例如,我有一项服务可以检索有关特定设备的信息。每个设备都有一个地址: sector.room.group.id 。
我为这个GET方法做的URI是:(...)/services_devices/{sector}/{room}/{group}/{id}
但现在我意识到我不应该使用'/'
来分隔设备地址,对吧?
我该如何将地址传递给此方法?使用';'
?
我的GET方法是:
@GET
@Path("{sector}/{room}/{group}/{id}")
@Produces("application/json")
public String getDeviceName(@PathParam("sector") int sector, @PathParam("room") int room, @PathParam("group") int group, @PathParam("id") int id) throws Exception
{
String name = null;
try {
name = new DevicesManager().getDeviceName(sector, room, group, id);
} catch (Exception e) {
e.printStackTrace();
}
return name;
}
有一种简单的方法可以改变这一点,以获得正确的URI吗?我在许多方法中都有这个“错误”。
答案 0 :(得分:0)
如果资源路径中存在层次结构,则变量是合适的。
在您的情况下,设备和地址之间似乎存在层次结构,但首先是地址和设备名称之后。 “deviceName”可以被视为一个更多的层次结构步骤。
反映上述关系的最佳方式是以下网址:
(...)/扇区/间/组/ ID / DEVICENAME
然后您可以将设备的另一个属性映射为:
(...)/扇区/间/组/ ID / deviceOwner
JAX-RS映射将是:
@GET
@Path("{sector}/{room}/{group}/{id}/deviceName")
@Produces("application/json")
public String getDeviceName(@PathParam ...) {
//impl.
}
是的,如果deviceName是资源的唯一相关属性,那么您可以省略“deviceName”并且您的orignal映射是正确的。
如果/sector/room/group/id
的资源有很多属性,您应该考虑为路径返回一个组合对象:
@GET
@Path("{sector}/{room}/{group}/{id}")
@Produces("application/json")
public Device getDeviceName(@PathParam...) {
}
答案 1 :(得分:0)
REST架构风格引入了HATEOAS,这意味着客户端和服务器是松散耦合的。只是客户端不知道URL的外观,并从之前的响应中获取它们。 (它类似于通过HTML页面浏览)。当然,客户端至少会有一个URL,一个入口点。从这个角度来看,您需要拥有正确的URI是无关紧要的。什么是正确的URI?当表单与RFC对齐时,URI是正确的。
您可能引入了非RESTful的URL模式,因为它暗示了客户端和服务器之间的紧密耦合(客户端必须知道URL模式并且能够从中构建URL;填充扇区/房间等。在你的情况下)
另见这篇文章:
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
我的建议是;不要在URL模式上浪费你的时间,尽可能简化URL,平面层次结构也有很多好处,并遵循HATEOAS原则。