2013-04-08 33 views
0

我开发了REST服务,但现在我意识到我在做错事。RESTful服务 - 如何设计具有多个参数的URL

例如,我有一项服务可以检索有关特定设备的信息。每个设备都有一个地址:sector.room.group.id。 我为这个GET方法所做的URI是:(...)/services_devices/{sector}/{room}/{group}/{id}但是现在我意识到我不应该使用'/'来分隔设备地址,对吧? 我应该如何将地址传递给此方法?使用​​3210?

我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

如果您只是将您的URI更改为/ services_devices/{address}并开始以您指定的格式(即/services_devices/sector.room.group.id)接受地址,该怎么办? – JSS 2013-04-08 17:24:59

+0

嗯,你是对的!我将需要解析这些字段,但我认为没有问题。 – user2144555 2013-04-08 17:31:10

+0

id在您的应用程序中是唯一的,还是只在指定的组中唯一?换句话说,如果你只提供/ services_devices/id,你可以查找扇区,房间和组? – phatfingers 2013-04-08 18:08:30

回答

0

如果您的资源路径中存在层次结构,则适当的变量。

在你的情况下,似乎在设备和地址之间有一个层次结构,但首先是地址和deviceName之后。 “deviceName”可以被认为是更多的层次结构步骤。

以反映上述关系将以下网址的最佳方式:

(...)/部门/间/组/ ID/DEVICENAME

然后,您可以有另这样映射的设备的属性:

(...)/扇区/间/组/ ID/deviceOwner

的JAX-RS映射将是:

@GET 
@Path("{sector}/{room}/{group}/{id}/deviceName") 
@Produces("application/json") 
public String getDeviceName(@PathParam ...) { 
//impl. 
} 

是的,如果该设备名称是资源的唯一相关的属性,那么你就可以离开了“设备名称”,您的一部开拓创新的映射是正确的。

如果/sector/room/group/id资源有许多属性,你应该考虑返回由对象的路径:

@GET 
@Path("{sector}/{room}/{group}/{id}") 
@Produces("application/json") 
public Device getDeviceName(@PathParam...) { 
} 
+0

那么,现在我的第一种方法是有道理的,因为'id'代表一个属于'group'的设备,而这个组属于''room',属于'sector'。所以它是元素(参数)的层次结构,所以它们可以用'/'分隔。我对吗? – user2144555 2013-04-08 18:23:56

+0

是的。想想如果你有更多的设备属性,不只是“deviceName”,也许你有deviceNumber,owner等等。如果是这种情况,创建并从GET方法返回一个'Device'对象 – dcernahoschi 2013-04-08 18:26:56

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