设计一个休息网址 - 在实体(不是最后一个实体)上使用多个参数进行过滤
Posted
技术标签:
【中文标题】设计一个休息网址 - 在实体(不是最后一个实体)上使用多个参数进行过滤【英文标题】:Designing a rest url - filter with multiple params over entities (not last entity) 【发布时间】:2014-02-26 22:58:24 【问题描述】:假设我的图书馆应用中有以下实体 - 图书馆室、书架、书籍。 其中 Room 有 N 个书架,而书架有 N 本书。
现在下面的 url 给我带来了一个书籍列表,其 图书馆是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¶m1=X¶m2=X¶m3=X¶m4=X
因为并非所有参数都与书籍相关。
【问题讨论】:
【参考方案1】:在设计 API 时需要考虑的几件事。
1) 是type
、decade
、topic
等必填字段吗?如果是这样,我可能会让它们成为路径本身的一部分,例如:
../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 本身的一部分
希望这会有所帮助!
【讨论】:
谢谢,很棒的资源。调查它。问题:您将解决方案#2 称为学术方法。为什么? (我想设计标准的rest api,因为我会有很多外部客户)。 我将其称为更多的学术方法,因为我没有看到它在平台上被大量使用,例如,google apis、linkedin apis、facebook apis、twitter apis 等。我只是保留这些知识在我的脑海中提醒自己在需要时使用其他方法。因此学术:)以上是关于设计一个休息网址 - 在实体(不是最后一个实体)上使用多个参数进行过滤的主要内容,如果未能解决你的问题,请参考以下文章
数据存储区 - 如果您删除一个实体,将来是不是可以在新创建的实体上重复使用它的实体 ID?