2013-02-25 116 views
2

我正在用Play 2.0构建应用程序。
只要Play表单生成器不会生成本地http“删除”请求方法,它应该替换为“Get”或“Post”。scala中的RESTful http DELETE方法(play 2.0)

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

根据Play示例,“Post”应该用于“删除”目的。尽管使用“Get”非常舒服,因为可以用简单链接替换表单(尤其是单页上的链接列表)

因此,是否有任何理由使用POST来模拟DELETE?

回答

10

之所以用POST用于仿真的DELETE代替GET是因为一些HTTP动词(又名方法)被认为是由HTTP规范安全。 These methods are HEAD, GET, OPTIONS and TRACE。这意味着当使用这些HTTP方法发出请求时,应用程序状态不应该有任何副作用。日志记录,缓存或计数器增量通常不被视为应用程序状态修改,除非它是应用程序域的一部分。

使用POST来模拟DELETE请求而不是直接在网络表单中使用DELETE的原因是因为许多浏览器不直接支持DELETE。许多使用助手(例如Play和Rails)生成表单标记的Web框架使用您引用的技巧将请求映射到代码中相应的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也是如此。

+0

Tnx。 Rails表单生成器使用额外的输入来传递方法名称,我想知道为什么Play不会这样做? – antiplayer 2013-02-26 10:02:16

2

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

您还可以使用Play's javascriptRoutes

+0

Tnx @biesior。 JavascriptRoutes似乎是一个好主意,但我不确定现在使用js路由。无论如何,阅读它很有趣。 Tnx为您的链接 – antiplayer 2013-02-26 10:10:35

0

大多数浏览器不能做的比HTML表单GET或POST其他HTTP请求,所以它的使用与覆盖头或特殊形式的变量HTTP POST普遍效仿。

Doing a HTTP PUT from a browser