用于获取子集列表的REST最佳实践

时间:2010-02-22 13:11:54

标签: rest

我在REST - complex applications阅读了这篇文章,它回答了我的一些问题,但不是全部。

我正在设计我的第一个REST应用程序,需要将“子集”列表返回给GET请求。以下哪一项更“RESTful”?

/patients;listType=appointments;date=2010-02-22;user_id=1234

/patients/appointments-list;date=2010-02-22;user_id=1234

甚至

/appointments/2010-02-22/patients;user_id=1234

我需要返回十几个不同的列表。在其中一些中,将有几个过滤参数,我不希望在我的服务器代码中使用大的“if”语句来根据存在的参数选择子集。例如,我可能需要所有患者为特定医生,其中覆盖医生是另一个,主要医生是另一个。我可以选择

/patients;rounds=true;specific_id=xxxx;covering_id=yyyy;primary_id=zzzz

但是这需要复杂的分支逻辑来获得正确的列表,其中要求特定子集(rounds-list)将实现同样的目标。

请注意,我需要使用矩阵参数而不是查询参数,因为我需要在URL的多个级别进行过滤。我正在使用的框架(RestEasy),完全支持矩阵参数。

3 个答案:

答案 0 :(得分:5)

拉​​尔夫,

特定的URI模式与您的应用程序将如何RESTful的问题正交。

与RESTfulness相关的是客户端发现如何在运行时构建URI 。这可以通过表单或URI模板实现。两个超媒体控件都告诉客户端可以使用哪些参数以及将它们放在URI中的位置。

为了使RESTful工作,客户端和服务器必须在设计时知道可能的参数。这通常是通过使它们成为链接关系规范的一部分来实现的。

例如,您可以定义“my-subset”链接关系以具有链接到集合子集的含义,并使用它来定义以下参数:

  

listType,date,userID。

在链接模板中,规范可以用作

  

< link rel =“my-subset'template =”/ {listType} / {date} / patients; user_id = {userID}“/>

请注意URI中的实际参数名称是如何与指定的参数名称分离的。 userID的值后缀为URI参数user_id。

这使得URI参数名称可以在不影响客户端的情况下进行更改。

您可以查看OpenSearch描述文档(http://www.opensearch.org),了解在实践中如何完成此操作。

实际上,您应该可以为您的用例充分利用OpenSearch。特别是预定义查询的功能允许您在“表单”中描述特定的子集。

但请亲自看看,然后再问一遍: - )

答案 1 :(得分:2)

我建议您使用此网址结构:

/appointments;user_id=1234;date=2010-02-22

为什么呢?我之所以选择/appointments是因为它简单明了。 (如果你有多种约会,请在评论中告诉我,我可以调整我的答案。)我选择了分号,因为它们并不意味着user_id和date之间的层次结构。

还有一件事,你没有理由将自己局限于一个网址。拥有多个引用相同资源的URL结构就可以了。所以你也可以使用:

/users/1234/appointments;date=2010-02-22

返回类似的结果。

那就是说,我不建议使用/dates/2010-02-22/appointments;user_id=1234。为什么?在实践中,我认为/dates不是指资源。日期是约会的一个属性,但它本身不是一个名词(即它不是一流的东西)。

答案 2 :(得分:-1)

我可以谈谈大卫詹姆斯回答的问题 您的URI格式可以像他建议的那样:

  

/appointments;user_id=1234;date=2010-02-22

和/或

  

/users/1234/appointments;date=2010-02-22

同时仍保持资源URI的可发现性(在运行时)(如Jan Algermissen建议的那样)。