我正在构建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中使用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方法名称,如闪烁(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
答案 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概念,但仍然没有在你的应用程序上做足够好的事情。
我认为您的案例中最好的解决方案是考虑您的业务逻辑。也许它可以在没有休息的情况下完成。
如果您认为无法完成,那么我会推荐您列出的第一个解决方案。感觉不那么错了。
希望它有所帮助。