5

我正在构建一个 REST API。实际上,我了解通用指南和规则。

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

如果你问什么数据让我在 DELETE 方法中通过 body 发送它,是一个 '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 中使用GET和。POST所以我可以使用 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)

我想我喜欢解决方案 1,使用“X-HTTP-Method-Override”。你怎么看?

谷歌似乎使用 X-HTTP-Method-Override,参考这个https://developers.google.com/gdata/docs/2.0/basics

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

4

3 回答 3

1

不能发送带有 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
于 2013-01-14T16:56:55.200 回答
0

URL 是要删除的内容项的标识信息吗?如果是这样的话,

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
于 2013-01-14T18:21:54.843 回答
0

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

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

我认为在您的情况下最好的解决方案是考虑您的业务逻辑。也许它可以在不中断 REST 的情况下完成。

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

希望能帮助到你。

于 2013-01-14T18:59:24.303 回答