在普通的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)。
是否有关于如何处理此问题的指南?我是出错了还是根本没有问题(从务实的角度来看)?
答案 0 :(得分:2)
由于已经提出了新地址请求,因此无法保留以前的URL。控制器仅为请求的资源提供响应。要转到上一个URL,您只能在验证失败的情况下进行重定向,但是您会丢失错误,因此这不是解决方案。
我建议使用相同的网址映射这两个操作。通过这种方式,您可以解决浏览器重新加载的问题。
如果为非浏览器的http客户端创建REST服务,则可能需要提供与简单http页面不同的响应。特定客户端的操作分离可能是保持REST API清洁和浏览器用户满意的好方法。