scala中的RESTful http DELETE方法(播放2.0)

时间:2013-02-25 23:11:04

标签: scala rest playframework-2.0

我正在使用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?

3 个答案:

答案 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 POSTFORM element in HTML 4.01也是如此。

答案 1 :(得分:2)

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

您也可以使用Play's javascriptRoutes

答案 2 :(得分:0)

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

请参阅Doing a HTTP PUT from a browser