通过代理ID或业务ID在资源上获取GET的REST方法

HDa*_*ave 7 java rest web-services jax-rs

我们有一些实体既有唯一的业务ID(例如"my-unique-name"),也有内部UUID(例如aa54-342-dffdf-55445-effab).什么是提供可以使用任一方法返回资源的REST URI的好方法.

方法1 - 有两个资源URL(丑陋!!!):

/富逐ID /我的唯一名称

/富逐UUID/aa54-342-dffdf-55445-effab

方法2 - 始终使用查询参数(即使它返回单个项目......似乎是un-rest-lke)

/富?ID =我的唯一名称

/富?=的uuid aa54-342-dffdf-55445-effab

方法3 - 让网络服务弄清楚{id}是否是UUID(这可能容易出错,但在所有likihood中都可以正常工作......

方法4 - 使用UUID,允许业务ID作为查询参数(不知道这是否可行)

/富?ID =我的唯一名称

/富/ aa54-342-dffdf-55445-effab

任何想法都表示赞赏.

Dar*_*ler 6

我会使用类似于选项4的东西.使用路径段中的UUID作为单个资源URL.使用备用URL作为一种搜索URL

例如

GET /foo?name=my-unique-name

303 See Other
Location: http://example.org/foo/aa54-342-dffdf-55445-effab
Run Code Online (Sandbox Code Playgroud)

您不希望有两个URL都返回具有相同资源的200.这会导致缓存污染.
现在,您可以自由地将GET"搜索样式"URL用于其他类型的搜索.

GET /foo?account=other-unique-value

303 See Other
Location: http://example.org/foo/aa54-342-dffdf-55445-effab
Run Code Online (Sandbox Code Playgroud)

或者你甚至可以搜索非独特的东西.

GET /foo?country=a-non-unique-value

200 OK
Content-Type: application/vnd.hal+xml

<resource href="http://example.org/foo?country=a-non-unique-value">
   <resource rel="urn:acme:foo" href="http://example.org/foo/aa54-342-dffdf-55445-effab"/>
   <resource rel="urn:acme:foo" href="http://example.org/foo/ba54-299-weras-55445-effab"/>
   <resource rel="urn:acme:foo" href="http://example.org/foo/ca54-743-werre-23434-effab"/>
<resource>
Run Code Online (Sandbox Code Playgroud)


fum*_*chu 5

选择一个作为规范,307将另一个重定向到它.如果不这样做,则会冒两个URI返回不同数据的风险,因为它们已在不同的时间或生命周期进行缓存.通过从一个重定向到另一个,您允许PUT,POST或DELETE请求使单个规范URI的缓存无效.使用307而不是302,以便"历史"客户端不会将POST更改为GET.我推荐方法1,让UUID重定向到商业ID只是因为它更漂亮.