关于DELETE方法的REST API设计

时间:2013-01-14 09:19:17

标签: php ruby-on-rails api rest api-design

我正在构建REST API。实际上我理解了共同的指南和规则。

但我有DELETE方法的问题,因为我需要在请求中通过正文发送数据,DELETE方法将忽略正文。

如果您询问哪些数据让我通过DELETE方法将其发送到正文,则是'url'和其他一些参数。当然'url'在数据库中有id,所以我可以使用DELETE,没有问题,比如DELETE https://api.example.com/content/url:url_id。但是,通过id,我选择传递它自己和其他一些参数的URL。我的业务逻辑和要求迫使我在DELETE方法中传递url而不是id。

所以在阅读之后,我发现还有一些代理阻塞DELETE和PUT方法。并且HTML表单仅支持GET和POST方法。

我开始认为最好只在我的REST API中使用GETPOST。 所以我可以使用POST进行删除和对象或资源,如下所示:

POST /content/delete/url
Body :
    url : xxxx
    param1 : xxxx
    param2 : xxx

但是在“REST API设计规则手册,O'reilly”中,第18页说

  
    

“HTTP请求方法应该用于指示哪个CRUD功能     执行“

  
     

以下反模式举例说明了不该做的事情:

GET /deleteUser?id=1234
GET /deleteUser/1234
POST /users/1234/delete

再次搜索和阅读之后,我找到了一些解决方案

  1. 使用X-HTTP-Method-Override

  2. 使用api方法名称,如闪烁(api.flickr.com/services/rest/?method=flickr.collections.getInfo)mailchimp(api.mailchimp.com/1.3/?method=campaignDelete)

  3. 我认为我喜欢解决方案1,使用'X-HTTP-Method-Override'。你觉得怎么样?

    Google似乎使用X-HTTP-Method-Override,对此https://developers.google.com/gdata/docs/2.0/basics

    进行了重新设置

    Flicker和Mailchimp使用方法名称,如解决方案2

3 个答案:

答案 0 :(得分:0)

CAN NOT 发送带有DELETE请求的正文。它没有意义!

RESTful将是

DELETE  http://www.plocal:3000/api/v1/content/page-1
DELETE  http://www.plocal:3000/api/v1/content/info-page
DELETE  http://www.plocal:3000/api/v1/content/1
DELETE  http://www.plocal:3000/api/v1/content/2

使用

进行测试
curl -v http://www.plocal:3000/api/v1/content -X DELETE

答案 1 :(得分:0)

网址是要删除的内容项的标识信息吗?如果是的话,

DELETE https://api.example.com/content/:id 

并将url作为id的一部分。 Id不必严格整数。

您可能还想制作新路线

resources :content, :except => [:delete] do
  member do
    delete delete_by_url
  end
end

然后你将有一个新的删除路由,在控制器中有一个更合适的名称和一个特定的动作。

DELETE https://api.example.com/content/:id/delete_by_url

答案 2 :(得分:0)

我知道它是您业务逻辑的一部分,但我建议您重新考虑它,或者尝试使用其他解决方案而不是REST。

通过做你提到的那些东西,你将破坏所有REST概念,但仍然没有在你的应用程序上做足够好的事情。

我认为您的案例中最好的解决方案是考虑您的业务逻辑。也许它可以在没有休息的情况下完成。

如果您认为无法完成,那么我会推荐您列出的第一个解决方案。感觉不那么错了。

希望它有所帮助。