RESTful服务 - 如何设计具有许多参数的URL

时间:2013-04-08 17:20:34

标签: java rest uri restful-architecture

我已经开发了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吗?我在许多方法中都有这个“错误”。

2 个答案:

答案 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原则。