[英]RESTful services - how to design a URL with many parameters
我已经开发了REST服务,但是现在我意识到自己在做错事。
例如,我有一个检索有关特定设备信息的服务。 每个设备都有一个地址: ector.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? 我在许多方法中都有这个“错误”。
如果您的资源中存在层次结构,则路径变量是适当的。
在您的情况下,设备和地址之间似乎存在层次结构,但是首先出现在地址之后,在deviceName之后。 可以将“ deviceName”视为另一个层次结构步骤。
反映上述关系的最佳方法是以下网址:
(...)/扇区/房间/组/ ID /设备名称
然后,您可以像下面这样映射设备的另一个属性:
(...)/部门/房间/组/ ID /设备所有者
JAX-RS映射将是:
@GET
@Path("{sector}/{room}/{group}/{id}/deviceName")
@Produces("application/json")
public String getDeviceName(@PathParam ...) {
//impl.
}
是的,如果deviceName是资源的唯一相关属性,则可以省略“ deviceName”,并且原始映射正确。
如果/sector/room/group/id
具有许多属性,则应考虑返回路径的组合对象:
@GET
@Path("{sector}/{room}/{group}/{id}")
@Produces("application/json")
public Device getDeviceName(@PathParam...) {
}
REST体系结构风格引入了HATEOAS,这意味着客户端和服务器之间是松散耦合的。 只是客户不知道URL的样子,并无法从先前的响应中获取它们。 (类似于通过HTML页面浏览)。 当然,将至少有一个客户端知道的URL,即入口点。 从这个角度来看,您是否需要正确的URI是无关紧要的。 什么是正确的URI? URI与RFC对齐时正确。
您可能正在引入不是RESTful的URL模式,因为它暗示了客户端和服务器之间的紧密耦合(客户端必须了解URL模式并具有从中构造URL的能力;根据您的情况填充扇区/房间/等)。 )
另请参阅此帖子:
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-超文本驱动
我的建议是; 不要浪费时间在URL模式上,要使URL尽可能简单,平面层次结构也有很多好处,并遵循HATEOAS原则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.