我正在使用Play 2.0构建应用程序 只要Play表单生成器不会生成本机http“删除”请求方法,它应该替换为“获取”或“发布”。
@form(routes.Application.delete(id), 'class -> "topRight") {
<input type="submit" value="Delete this computer" class="btn danger">
}
根据Play示例,“Post”应用于“删除”目的。虽然使用“Get”非常舒服,因为表单可以用简单的链接替换(特别是在单个页面上有这些链接的列表)
有没有理由使用POST来模拟DELETE?
答案 0 :(得分:10)
使用POST
模拟DELETE
而不是 GET
的原因是因为HTTP认为某些HTTP谓词(也称为方法)是安全的规格。 These methods are HEAD
, GET
, OPTIONS
and TRACE
。这意味着在使用这些HTTP方法发出请求时不应该有应用程序状态的任何副作用。记录,缓存或计数器增量通常不被视为应用程序状态修改,除非它是应用程序域的一部分。
使用POST
模拟DELETE
次请求而非直接在网络表单中使用DELETE
的原因是因为许多浏览器不直接支持DELETE
。许多使用帮助程序生成表单标记的Web框架(如Play和Rails)使用您引用的技巧将请求映射到代码中相应的REST-ish操作。有关详细信息,请参阅HTTP Method Support in Browsers。有关此主题的更多信息,另请参阅this SO question。根据W3C对HTML5的最新候选推荐,HTML5 FORM
element does not support values for the method
attribute other than GET or POST。 FORM
element in HTML 4.01也是如此。
答案 1 :(得分:2)
要使用非GET
或POST
方法,您应该使用JavaScript - 例如jQuery $.ajax()及其type
设置。
您也可以使用Play's javascriptRoutes
答案 2 :(得分:0)
大多数浏览器无法从HTML表单执行除GET或POST之外的HTTP请求,因此通常使用带有覆盖标头或特殊表单变量的HTTP POST进行模拟。