В обычном приложении Play у меня есть следующий сценарий.Play Framework: не изменять URL-адрес после проверки формы.
Файл маршрут, который выглядит следующим образом:
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));
}
...
}
Теперь вещь, клиент будет см. один и тот же обзор с некоторыми дополнительными сообщениями об ошибках. Тем не менее, между тем URL-адрес изменился с 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 vs. PUT/accounts /: id).
Есть ли руководство по управлению этим? Я что-то ошибаюсь или это вообще не проблема (с прагматической точки зрения)?
Не могли бы вы прояснить, что вы имеете в виду, говоря: «Но с точки зрения REST это тоже не очень хорошо»? –
Несомненно. Я хочу, чтобы новые ресурсы учетной записи создавались путем выполнения POST для/учетных записей (не для/accounts/new), потому что это «правильно», т. Е. Семантика понятна, если посмотреть на определение маршрута. Чтобы выполнить POST в/accounts/new, возможно, запутайте других клиентов, если они используют один и тот же API. Как я уже сказал, может быть, это не такая уж большая проблема, как мне кажется. – alexhanschke