【问题标题】:Redirect with Bad Request Status请求状态错误的重定向
【发布时间】:2014-06-09 20:31:32
【问题描述】:

我正在使用 Play Framework v2.2.2 (scala) 并尝试以 400(错误请求)状态进行重定向。

目前我正在使用反向路由进行重定向,如下所示:

Redirect(Games.Controllers.routes.SportViewController.show)

我希望能够指定重定向的状态。我尝试在调用中添加一个额外的参数,但我得到一个编译错误:

重载的方法值 [Redirect] 无法应用于 (play.api.mvc.Call, Int)

在文档中,我注意到您可以指定带有重定向状态的字符串 uri,但是,我真的很想继续在我的代码中使用反向路由,而不是到处使用字符串 uri 值。

Redirect("redirect/path", status = 400)

关于如何使用反向路由完成错误请求 (400) 重定向的任何想法或建议?我在文档中遗漏了什么吗?有完全不同/更好的方法吗?

非常感谢!


编辑

为了提供更多关于我为什么询问具有特定状态的重定向的背景信息。我正在处理一个表单帖子。在成功的帖子上(例如,用户发布的数据有效),然后重定向到路由 X,在不成功的帖子上(例如,用户数据丢失或无效),然后重定向到路由 Y。在不成功的帖子上,应该是什么状态代码用过吗?

【问题讨论】:

  • 不应该是两个独立的问题吗?

标签: scala redirect playframework playframework-2.0 bad-request


【解决方案1】:

重定向操作应用于 HTTP 规范 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html 中定义的 3XX 重定向。

当调用重定向操作时,它将设置一个位置标头(请参阅 14.30 位置)以及一个 3xx 状态标头。浏览器将尝试从位置标头加载 URI 作为新请求,因此将使用最终目的地的 HTTP 状态代码。

重定向只能用于

  • 在成功的表单发布结束时,防止在刷新/返回按钮上重复提交
  • 一段内容已移动,在旧 URI 中不再可用

如果您想明确给出 400 错误,您需要使用 BadRequest 操作并从您的应用中提供错误页面。

def badAction = BadRequest {
  views.html.myError
}

或者如果您想重定向到外部页面,请保留现有的默认 3XX 状态

【讨论】:

  • 嗨亚当,谢谢你的帖子。所以在表单发布不成功的情况下,我不应该使用重定向吗?
  • 这取决于用例。如果表单发布不成功,通常您会将用户带回到显示先前数据的表单,并突出显示错误,以便他们可以修复它们。在这种情况下,重定向不适合。
  • 如果您不使用重定向,您建议如何让用户回到表单?
  • @Adam 如果用户试图访问受保护的页面但未通过身份验证,那么如何将用户重定向到登录表单(或类似的东西)?您会将它们重定向到登录网址,但它是一个 4XX,不是吗?
【解决方案2】:

这是您感兴趣的Redirect 的签名(减去更改后的状态):

def Redirect(call: Call): SimpleResult = Redirect(call.url) 

它只是调用另一个重载来完成腿部工作:

def Redirect(url: String, queryString: Map[String, Seq[String]] = Map.empty, status: Int = SEE_OTHER)

因此我们可以轻松创建自己的重载,使用我们自己的控制器调用上述重载:

def Redirect(call: Call, status: Int): SimpleResult = Redirect(call.url, Map.empty, status)

【讨论】:

  • 您好 LimbSoup,感谢分享。这是一个有趣的想法。我很惊讶这没有内置到框架中。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 2016-11-30
  • 2019-09-13
  • 2017-09-07
  • 2015-04-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多