2

我正在使用 Play 2.0 构建应用程序。
至于 Play 表单生成器不会生成原生 http“删除”请求方法,应将其替换为“获取”或“发布”。

@form(routes.Application.delete(id), 'class -> "topRight") {
    <input type="submit" value="Delete this computer" class="btn danger">
}

根据播放示例,“发布”应用于“删除”目的。尽管使用“获取”很舒服,因为可以用简单的链接替换表单(尤其是在单个页面上包含这些链接的列表)

那么有什么理由使用 POST 来模拟 DELETE 吗?

4

3 回答 3

10

使用POSTemulatingDELETE 而不是 的 GET原因是因为一些 HTTP 动词(又名方法)被 HTTP 规范认为是安全的。这些方法HEADGETOPTIONSTRACE这意味着在使用这些 HTTP 方法发出请求时,应用程序状态不应有任何副作用。日志记录、缓存或计数器增量通常不被视为应用程序状态修改,除非它是应用程序域的一部分。

POST用于模拟DELETE请求而不是直接在 Web 表单中使用的原因DELETE是因为许多浏览器不DELETE直接支持。许多使用助手生成表单标记的 Web 框架,如 Play 和 Rails,使用您引用的技巧将请求映射到代码中相应的 REST-ish 动作。有关详细信息,请参阅浏览器中的 HTTP 方法支持。有关此主题的更多信息,另请参阅此 SO 问题。根据 W3C 对 HTML5 的最新候选推荐,HTML5FORM元素不支持methodGET 或 POST 以外的属性值。FORMHTML 4.01中的元素也是如此。

于 2013-02-25T23:38:23.010 回答
2

对于使用非 -GETPOST方法,您应该使用 JavaScript - 例如jQuery $.ajax()及其type设置。

你也可以使用Play 的 javascriptRoutes

于 2013-02-25T23:23:41.443 回答
0

大多数浏览器不能从 HTML 表单执行除 GET 或 POST 之外的 HTTP 请求,因此它通常使用带有覆盖标头或特殊表单变量的 HTTP POST 来模拟。

请参阅从浏览器执行 HTTP PUT

于 2013-02-25T23:36:12.613 回答