【问题标题】:How do I invoke non-GET/POST HTTP methods in Play?如何在 Play 中调用非 GET/POST HTTP 方法?
【发布时间】:2012-05-06 16:56:33
【问题描述】:

我有一个 RESTful Play 2.0 应用程序,我想通过浏览器中的链接调用 DELETE /sessions

我该怎么做? Rails 有一个约定,对非 GET/POST 请求使用 _method 查询参数,但 Play 的文档没有提到这一点。

另外,我是否必须创建一个单独的表单或 XMLHttpRequest 才能从链接的 href 调用该方法,或者是否有类似 Rails 的 data-method 属性的东西?

【问题讨论】:

    标签: rest playframework playframework-2.0


    【解决方案1】:

    你不会用公共链接这样做。

    Cite from similar topic on Google Groups:

    链接(A 标记)不适用于 DELETE 方法。语义 链接是“链接”到另一个可以检索的资源 使用 GET 请求。您可以在 Ajax 或表单中执行 DELETE 请求 使用 POST 方法并包含带有名称的隐藏输入 “X-HTTP-Method-Override”和值“DELETE”。

    这是什么意思:你需要使用 GET 来删除项目:

    conf/routes:

    GET   /delete/:itemId    controllers.Application.deleteItem(itemid : Long)
    

    在你看来:

    <a href="@routes.Application.deleteItem(item.id)">Delete @item.name</a>
    

    或者使用 AJAX 调用:

    <script type="text/javascript">
        $.ajax({
            url:"@routes.Application.actionToDeleteSomething()",
            type:"DELETE"
        });
    </script>
    

    【讨论】:

    • 似乎正确。但是,我想说这种特定于客户端的特定问题不能反映在服务器中。此外,REST 范式现在被打破了。因此,应该做的是不要使用 标签,而是使用像链接一样呈现的 。并在路线中保留 DELETE。或者至少,将 GET 和 DELETE 保留在路由中,针对同一个控制器
    • 感谢您的回答,但我同意 Andy 的观点,即添加专用 URL 感觉不对。我所做的只是将DELETE 方法保留在routes.conf 中,然后,当用户单击链接时,调用一个JavaScript 函数,该函数通过设置document.location.href 的成功回调对DELETE 方法进行Ajax 调用到目标页面。仍然很老套,但它使客户端变得丑陋,并使 REST 完好无损。
    • 您不应该在GET http 请求上删除资源。
    • @JulienRichard-Foy:那又如何呢?每个删除操作的表单还是 ajax?
    • 是的。 GET 操作应该没有副作用。
    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2012-06-10
    • 2021-02-16
    相关资源
    最近更新 更多