RESTful API最佳实践,更新与自定义操作

时间:2011-12-29 15:09:36

标签: ruby-on-rails api rest

我正在实现RESTfull API与AWS RDS通信,security_groups资源支持典型的CRUD谓词。当谈到“授权”和“撤销”时,我不确定什么是最佳做法,你认为哪一个最好?

自定义操作,网址中的参数

PUT agifog:3000/rds/security_groups/:security_group/authorize?ec2name='default'&ec2owner='0123456789'

自定义操作,传递参数

PUT agifog:3000/rds/security_groups/:security_group/authorize
{
    "ec2name": "default"
    "ec2owner": "0123456789"
}

标准更新

PUT agifog:3000/rds/security_groups/:security_group
{
    "operation": "authorize"
    "ec2name": "default"
    "ec2owner": "0123456789"
}

2 个答案:

答案 0 :(得分:3)

PUT并不意味着"更新"超过POST意味着"插入"。 PUT表示"把它放在这里"。

RESTful实践围绕将您的URL视为资源,在您的域中具有某些含义的实体,您对其执行操作(HTTP请求的动词)。

您可以做的是将安全组视为您正在采取行动的资源,PUT用户加入群组或DELETE来自群组:

PUT agifog:3000/rds/security_groups/:security_group/default
{
    "ec2owner": "0123456789"
}

DELETE agifog:3000/rds/security_groups/:security_group/default

这些可以对应于授权和撤销操作,并且可以轻松查看组中的GET如何生成当前组中所有用户的列表。

答案 1 :(得分:1)

第二个似乎是最RESTful的。您有一个资源(安全组)和一个自定义操作(授权),它将响应您的请求的动词(PUT)。

PUT agifog:3000/rds/security_groups/:security_group/authorize
{
    "ec2name": "default"
    "ec2owner": "0123456789"
}

同样地:

PUT agifog:3000/rds/security_groups/:security_group/revoke

(注意:如果它会生成会话或其他一些身份验证数据/令牌,我可能更喜欢上面的POST。)

为了进行比较,如果您有兴趣更新该资源的属性,那么您需要执行以下操作:

PUT agifog:3000/rds/security_groups/:security_group
{
    "some_attr1": "some_val"
    "some_other_attr": "some_val"
}

在这种情况下,PUT意味着它是该资源的更新。