2017-04-11 25 views
1

我想将操作添加到我的REST API中,以便在不同“存储”之间移动“资源”。在RESTful URL中使用动词和形容词的替代方案

例如,假设我的资源通过以下网址正常访问:

/resources 
/resources/{resourceId} 

现在假设我想“停用”一些资源,即在概念上它移动到另一个子文件夹。最直接的方法就是遵循这一点。

  1. '取消'资源,即导致资源在/ resources下不可用。从概念上讲,它是移动“对象的 '/资源/取消/' 子文件夹:

    POST /resources/{resourceId}/deactivate 
    

    或者:

    POST /resources/deactivated/{resourceId} 
    
  2. 获取所有停用的对象:

    GET /resources/deactivated  
    
  3. 颠倒'禁用'动作,即从概念上将对象从'/resources/deactivated/'子文件夹返回到主文件夹('/resources')。

    要么

    POST /resources/{resourceId}/reactivate  
    

    或者

    POST /resources/deactivated/{resourceId}/restore  
    

    这个API似乎相当直观的我。但它似乎违反了我在许多最佳实践中看到的'更喜欢名词'规则 - 有关REST API的文章:我使用动词和形容词来代替名词!

请注意,我可能有所有端点的参数,例如, GET/resources/deactivated?createdBefore = 01022017

对于我的REST API有更好的选择吗?即更多RESTful,但不是更不直观的?

回答

4

首先,请记住,REST代表重新表象小号泰特牛逼转让(BOT)。

这全是关于资源及其状态。操作如激活,停用移动都是关于用新的表示替换资源的当前状态,并且您不需要URL中的动词来表示这样的操作。

PUT /api/resources/[id]/status HTTP/1.1 
Host: example.org 
Content-Type: application/json 

{ "status" : "active" } 

可以理解为更换:


例如,要替换资源的状态,您可以在PUT请求的有效载荷发送资源的新表示通过[id]标识的资源的状态与请求有效负载中发送的资源的状态。


然后,你可以有以下与特定的状态,以获得资源:

GET /api/resources?status=active HTTP/1.1 
Host: example.org 
Accept: application/json 

可以理解为给我的所有资源的表示与状态active


移动资源到另一个文件夹,例如,你可以有:

PUT /api/resources/[id]/folder HTTP/1.1 
Host: example.org 
Content-Type: application/json 

{ "target" : "draft" } 

可以理解为替换派出由[id]与一个标识的资源的文件夹请求有效载荷

+1

我喜欢你的答案(投票),因为它给了我一个更好的了解REST方法。但我不认为简单地改变'状态'属性对我来说是不可接受的,因为'GET/resources'不应该返回被禁用的属性。 – Alexander

+1

@Alexander要获取所有资源,您可以请求'GET/api/resources'。它将返回活动和非活动的。要过滤'resources'集合,可以使用'status'之类的查询参数。所以'GET/api/resources?status = active'会返回活动的,而'GET/api/resources?status = inactive'会返回不活动的。您可以为您的查询参数设定默认值。如果'status'被忽略,假设你只想要活动的。 –

+0

我不同意。 'GET/resources'应该返回所有的对象,而不管特定属性的值如何,否则它会很混乱。但另一方面,它不应该返回“停用”的,这意味着它不是简单的常规属性。 – Alexander

2

是活动的资源真的比停用RESO不同urce?考虑只需要一个跟踪active的房产。您可以随时筛选出来,如

GET /things?active=true 

您可以用microPUT

PUT /things/{id}/active 
false 

如果thingdeactivated-thing在概念上是不同的,这是合理的有两个单独的端点改变这一点财产。我会用

POST `/deactivated-things` 
{ 
    "thing": "/things/12" 
} 

它们之间移动
POST `/things` 
{ 
    "deactivated-thing": "/deactivated-things/12" 
} 

你应该尽量避免多重含义的路径。例如,不这样做:

/resources/{id} 
/resources/deactivated/{id} 

/resources后,不要超载路径段的含义。

0

感谢Cassio强调'改变对象状态'的方法。

我自己的答案的完整性:

PATCH /resources/{resourceId} with body {"active":false} -- deactivate a resource 
PATCH /resources/{resourceId} with body {"active":true} -- restore a resource 
GET /resources      -- return all 'normal' resources 
GET /resources?includeInactive=true -- return all resources including the deactivated ones 
GET /resources/{resourceId}   -- return the resource 

(通过在 'GET' 将包含属性检索到的资源的积极=真/假“)。

似乎是一个经典案例PATCH:REST API PATCH or PUT

相关问题