设计一个rest url - 在实体上使用多个参数的过滤器(不是最后一个实体)

时间:2014-02-03 12:38:28

标签: api rest web

假设我的图书馆应用程序中有以下实体 - Library Room,shelf,Book 房间有N个架子,架子上有N书。

现在,以下网址为我提供了一份书籍清单 图书馆是3,房间没有。是5和货架号。是43岁。

.../library/3/room/5/shelf/43/books

假设货架43每个房间只有一个唯一的 (其他房间也有架子43)
和图书馆的房间并不是独一无二的(图5中有几个房间) 这是我的问题:

我想在实体上使用更多字段进行过滤,这是我想要做的 (代表不休息):

.../library/id=3&type=3/room/decade=21&topic=horror/shelf/location=east&/books

这不是休息 我如何在休息时代表它? 注:
我不想这样做

  .../books&param1=X&param2=X&param3=X&param4=X

因为并非所有参数都与书籍有关。

1 个答案:

答案 0 :(得分:1)

在设计api时需要考虑的一些事情。

1)是typedecadetopic等必填字段?如果是这样,我可能会将它们作为路径本身的一部分,例如:

../libraries/{libraryId}/type/{typeId}/rooms/{roomId}/decades/{decadeId}/topics/{topicName}/shelves/{shelfId}/locations/{shelfLocation}/books

这里我假设每个图书馆可以拥有每个图书馆都有独特房间ID的房间,每个房间可以有每个房间有独特的ID /位置的架子(等等)。是的,网址很长,但这是预期的

2)如果不需要这些字段,您可以使用不同的方法,这对于从未在此处使用此类方法的客户端开发人员来说稍微冗长但有点混乱。这是一个直接的示例Restful Java with JAX-RS by Bill Burke

 @Path("{first}-{last}")
 @GET
 @Produces("application/xml")
 public StreamingOutput getCustomer(@PathParam("first") String firstName,
 @PathParam("last") String lastName) {

 ...

 }

Here, we have the URI path parameters {first} and {last}. If our HTTP request is
GET /customers/bill-burke, bill will be injected into the firstName parameter and
burke will be injected into the lastName parameter.

如果我们遵循这种有点学术的方法(我没有看到这在许多平台上实现。大多数平台通常采用方法#1,一种更详细但更清晰的方法),您的URL看起来有点像这样:

../libraries/{libraryId}-{typeId}/rooms/{roomId}-{decadeId}-{topicName}/shelves/{shelfId}-{shelfLocation}/books

这样,如果客户端开发人员未传入非必填字段,您可以在业务逻辑级别处理它并为这些变量分配默认值,例如:

../libraries/3-/rooms/2-1-horror/shelves/1-/books

使用此url,libraryId = 3,typeId = null(因此可以默认为默认值),依此类推。请记住,如果libraryId是必填字段,那么您可能希望实际将其作为pathparam本身的一部分

希望这有帮助!