2014-08-27 2 views
2

В обычном приложении 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).

Есть ли руководство по управлению этим? Я что-то ошибаюсь или это вообще не проблема (с прагматической точки зрения)?

+0

Не могли бы вы прояснить, что вы имеете в виду, говоря: «Но с точки зрения REST это тоже не очень хорошо»? –

+0

Несомненно. Я хочу, чтобы новые ресурсы учетной записи создавались путем выполнения POST для/учетных записей (не для/accounts/new), потому что это «правильно», т. Е. Семантика понятна, если посмотреть на определение маршрута. Чтобы выполнить POST в/accounts/new, возможно, запутайте других клиентов, если они используют один и тот же API. Как я уже сказал, может быть, это не такая уж большая проблема, как мне кажется. – alexhanschke

ответ

2

Невозможно оставить предыдущий URL-адрес, потому что запрос на новый адрес уже сделан. Контроллер предоставляет только ответ на запрошенный ресурс. Чтобы перейти к предыдущему URL-адресу, вы можете сделать перенаправление только в случае сбоя проверки, но вы потеряли бы ошибки таким образом, чтобы это не было решением.

Предлагаю сопоставить оба действия с тем же URL. Таким образом, вы решите проблему с перезагрузкой браузера.

Если вы создаете службу REST для http-клиентов, которые не являются браузерами, вы, вероятно, захотите использовать другой ответ, чем простая страница http. Разделение действий для конкретных клиентов может быть хорошим решением для поддержания чистого REST API и счастливого пользователя браузера.

+0

Спасибо, Дэниэл, я также подумал о переадресации, и вы правы, это не совсем решение, так как я должен отслеживать контекст (возможно, используя флэш-область или что-то еще). Так что, в конце концов, я могу использовать один и тот же URL-адрес, но я бы хотел услышать о нем больше. – alexhanschke

Смежные вопросы