我在REST阅读了这篇文章- 复杂的应用程序,它回答了我的一些问题,但不是全部.
我正在设计我的第一个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),完全支持矩阵参数.
拉尔夫,
特定的URI模式与您的应用程序将如何RESTful的问题正交.
RESTfulness的重要之处在于客户端发现如何在运行时构造URI .这可以通过表单或URI模板实现.两个超媒体控件都告诉客户端可以使用哪些参数以及将它们放在URI中的位置.
为了使RESTful工作,客户端和服务器必须在设计时知道可能的参数.这通常通过使它们成为链接关系规范的一部分来实现.
例如,您可以定义"my-subset"链接关系以具有链接到集合子集的含义,并使用它来定义以下参数:
listType,date,userID.
在链接模板中,规范可以用作
请注意URI中的实际参数名称是如何与指定的参数名称分离的.userID的值后缀为URI参数user_id.
这使得URI参数名称可以在不影响客户端的情况下进行更改.
您可以查看OpenSearch描述文档(http://www.opensearch.org),了解在实践中如何完成此操作.
实际上,您应该可以为您的用例充分利用OpenSearch.特别是预定义查询的功能允许您在"表单"中描述特定的子集.
但请亲自看看,然后再问一遍:-)
一月