2010-11-10 37 views
6

我想问一个关于我公开的REST HTTP API的设计问题。REST设计问题需要暴露给客户端的资源的多个标识符

我有时访问控件ID为3:

http://ourserver/service/widgets/3

ID为3

插件获取,但我有时也需要通过它来访问一个Widget的SKU#。

通过2个URL公开相同的资源是错误的吗?

BUt我需要我的客户通过它的ID或它的SKU来获取小部件。

以下哪项更好?

  • http://ourserver/service/widgets/bysku/skyunumber
  • http://ourserver/service/widgets/skyunumber?idtype=sku

再次重复,我需要我的客户能够查找一个窗口小部件在两种不同的方式。什么是设计网址的最佳方式?

+0

我不知道......似乎不相关。做什么都行。 – Stephen 2010-11-10 21:38:41

+2

我在问一个关于宁静服务的正确设计的问题。这并非无关紧要,但感谢您的意见。 – rest 2010-11-10 21:39:15

+0

为什么你不能传递两次相同的URI? – 2010-11-10 21:40:07

回答

13

我会建议考虑以下几点:

GET http://ourserver/service/widgets?sku=34342323 
=> 
303 See Other 
Location: http://ourserver/service/widgets/43 

GET http://ourserver/service/widgets/43 

通过使用重定向,可以支持任意数量的标准找到小部件。要考虑的关键问题是当您启用缓存时发生的情况。如果您从多个URL返回表示形式,最终会以多个副本污染高速缓存,并且在执行更新时会使缓存中的副本无效化变得更加困难。

+0

不错的想法,但我会调用这个API数百万次,这会对我造成很大的开销。 – rest 2010-11-11 05:05:27

+0

@rest 303响应本身是可缓存的,所以每个sku只需要一次额外的往返。 – 2010-11-11 12:11:48

+0

“REST风格的Web服务”中描述的类似解决方案P.84 – 2012-10-18 13:00:14