【发布时间】:2012-12-28 06:03:46
【问题描述】:
我正在构建一个 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
再次搜索和阅读后,我提出了一些解决方案
使用
X-HTTP-Method-Override使用 api 方法名称,如 flicker
(api.flickr.com/services/rest/?method=flickr.collections.getInfo)和mailchimp(api.mailchimp.com/1.3/?method=campaignDelete)
我想我喜欢解决方案 1,使用“X-HTTP-Method-Override”。你怎么看?
Google 似乎使用 X-HTTP-Method-Override,请参考 https://developers.google.com/gdata/docs/2.0/basics
Flicker 和 Mailchimp 使用方法名称,如解决方案 2
【问题讨论】:
-
您可以使用 DELETE 发送正文有效负载(请参阅stackoverflow.com/a/5928241/89771)。
-
@AlixAxel:我也是这么想的——并以这种方式编写了我的 API。但这是个坏主意。最后一些代理/网关剥离了删除请求的主体。我们正在使用 WS02 API Gateway 并将其剥离,因此如果从外部调用,我的实际 API 永远不会看到主体(内部调用工作正常)。对我来说,完全需要正文的原因是同一个网关不喜欢 : 在 URL 参数中,而我的 id 包括它们。
标签: php ruby-on-rails api rest api-design