如何使用“DELETE” HTTP动词发送请求?

5
我想在Rails应用程序的视图中创建一个链接,实现以下功能...
DELETE /sessions

我该怎么做。

额外的复杂性:

"session"资源没有模型,因为它代表用户登录会话。CREATE表示用户登录,DESTROY表示注销。

这就是为什么URI中没有ID参数。

我正在尝试在UI中实现“注销”链接。

4个回答

19

正确,浏览器实际上不支持发送删除请求。许多Web框架的接受惯例是发送一个设置为“DELETE”的_method参数,并使用POST请求。

这里是Rails的一个示例:

<%= link_to 'log out', session_path, :method => :delete %>

您可能想要查看Restful Authentication


4
我不了解具体的Rails,但我经常使用JavaScript构建发送DELETE(和PUT)请求的网页。我只是使用XmlHttpRequest对象来发送请求。
例如,如果您使用jQuery:
有一个链接看起来像这样:
<a class="delete" href="/path/to/my/resource">delete</a>

并运行此 JavaScript:

$(function(){
    $('a.delete').click(function(){
        $.ajax(
            {
                url: this.getAttribute('href'),
                type: 'DELETE',
                async: false,
                complete: function(response, status) {
                    if (status == 'success')
                        alert('success!')
                    else
                        alert('Error: the service responded with: ' + response.status + '\n' + response.responseText)
                }
            }
        )
        return false
    })
})

我凭记忆写了这个示例,但我相当肯定它可以工作...


1
Rails内置的链接方法将生成类似以下内容:
<a href="/sessions?method=delete" rel="nofollow">Logout</a>

如果你不想使用Rails内置的方法(即不想使用 rel="nofollow",这会防止搜索引擎爬虫跟踪链接),你也可以手动编写链接并添加 data-method 属性,像这样:
<a href="/sessions" data-method="delete">Logout</a>

浏览器只能发送GET / POST请求,因此这将向您的Rails服务器发送普通的GET请求。 Rails将解释并路由此作为DESTROY / DELETE请求,并调用适当的操作。

1

如果我说错了,请告诉我,但我认为您只能使用浏览器(在HTML中)发送POST和GET请求。


1
正确;但是,您可以使用JavaScript发送任意动词的请求。 - Aaron Maenpaa
2
Rails也会处理没有JavaScript的情况,它会添加一个名为_method的隐藏输入字段,并将其设置为PUT/POST/DELETE,然后假装它得到了这种HTTP方法。 - Otto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接