Play框架:在表单验证失败后不要更改URL

时间:2014-08-27 09:40:25

标签: rest playframework playframework-2.0

在普通的Play应用程序中,我有以下情况。

一个如下所示的路径文件:

GET        /accounts/add        controllers.Accounts.add()
POST       /accounts            controllers.Accounts.create()

第一条路线会生成我可以添加新帐户的视图。提交新帐户的表单如下所示:

@helper.form(action = routes.Accounts.create()) {...}

现在,控制器将输入绑定到表单并检查是否存在任何验证错误:

public static Result create() {
    Form<Account> form = Form.form(Account.class).bindFromRequest();
    if (form.hasErrors()) {
        return badRequest(views.html.account.add.render(form));
    }
    ...
}

现在问题是,客户端将看到相同的视图以及一些其他错误消息。但是,同时网址已从http://example.com/accounts/add更改为http://example.com/accounts

如果客户端现在重新加载浏览器,则调用GET http://example.com/accounts(在这种情况下甚至不会映射 - 因此得到404 - 未找到)。

也许它只是我,但我发现这种烦人并浏览一些GitHub项目,我无法找到一个很好的解决方案。

如果将第二条路线重写为:

,原因会更简单
POST        /accounts/add        controllers.Accounts.create()

......在这种情况下一切正常。但从REST的角度来看,这也不是很好。这同样适用于更新方案(具有GET / accounts /:id / update与PUT / accounts /:id)。

是否有关于如何处理此问题的指南?我是出错了还是根本没有问题(从务实的角度来看)?

1 个答案:

答案 0 :(得分:2)

由于已经提出了新地址请求,因此无法保留以前的URL。控制器仅为请求的资源提供响应。要转到上一个URL,您只能在验证失败的情况下进行重定向,但是您会丢失错误,因此这不是解决方案。

我建议使用相同的网址映射这两个操作。通过这种方式,您可以解决浏览器重新加载的问题。

如果为非浏览器的http客户端创建REST服务,则可能需要提供与简单http页面不同的响应。特定客户端的操作分离可能是保持REST API清洁和浏览器用户满意的好方法。