使用 Play 框架覆盖 HTTP 方法

Posted

技术标签:

【中文标题】使用 Play 框架覆盖 HTTP 方法【英文标题】:Override HTTP method with Play framework 【发布时间】:2011-09-16 20:05:58 【问题描述】:

一些 Web 框架提供了使用隐藏表单字段“覆盖”HTTP 方法的可能性:

<form method="POST">
  <input type="hidden" type="_method" value="PUT">
  ...
</form>

是否可以?

【问题讨论】:

【参考方案1】:

注意:这仅适用于 Play 1.x。

查看source code 的Router.route() 方法,它在查询字符串中使用x-http-method-override 参数。根据this bug report,您应该也可以使用 HTTP 标头来实现这一点,但我在源代码中看不到这一点。

要使其工作,您需要将覆盖添加到请求字符串。我运行了以下示例以使其正常工作。

<form action="@Application.form?x-http-method-override=PUT" method="POST">
  <input type="submit" type="go" value="go">
</form>

如果您将日志记录级别设置为 TRACE,您将看到以下输出,显示方法已更改。您应该会看到类似 --

的输出
08:20:34,855 TRACE ~ init: begin
08:20:34,858 TRACE ~ Route: /application/form - x-http-method-override=PUT
08:20:34,859 TRACE ~ request method POST overriden to PUT
08:20:34,860 TRACE ~ ------- public static void controllers.Application.form()
08:20:34,861 TRACE ~ init: end true

您也可以查看控制器中的request.method 进行确认。

【讨论】:

【参考方案2】:

在 Play2 中,这是不可能的,创作者 have indicated 表示没有计划支持它。您必须手动拦截请求并通过覆盖 Global.onRouteRequest 来更改 HTTP 方法。

【讨论】:

以上是关于使用 Play 框架覆盖 HTTP 方法的主要内容,如果未能解决你的问题,请参考以下文章

play框架使用起来(14)-高级指南

play框架使用起来(14)-高级指南

Play 框架 2.4 的 HTTP 基本身份验证

如何在 Play 的静态方法中使用 play.cache.CacheApi!框架 2.4.2

如何在 Play 中覆盖 CRUD 标签!框架 1.2.4

Scala下Play框架学习笔记(Http Routing)