POST / Redirect / GET с неверной отправкой формы?

11

В области веб-разработки, является ли хорошей практикой делать POST / Redirect / GET, когда поля в отправке формы также недействительны?

Как правило, в этом случае не было бы никакой конфиденциальной транзакции. Однако можно ли привести аргумент, что, тем не менее, все еще является хорошей практикой использование шаблона POST / Redirect / GET?

Достойный Дилетант
источник

Ответы:

10

С точки зрения REST, веб-разговор должен идти так

GET / пример

200 ОК - содержит пустую форму HTML

Пользователь заполняет форму

POST / пример

formfield1 = ок

formfield2 = плохо

400 BAD REQUEST - содержит заполненную форму HTML с ошибками

Пользователь идентифицирует проблему с отправкой формы и исправляет ее

POST / пример

formfield1 = ок

formfield2 = фиксированная

201 CREATED - содержит HTML с сообщением об успешном завершении и последующими ссылками (также заголовок Location для клиентов REST) ​​или 200 OK и 204 НЕТ КОНТЕНТА приемлемы

Нет необходимости вводить перенаправление, и это нарушит семантику диалога.

Гэри Роу
источник
1
О, да, как я мог забыть о REST или просто о других кодах статуса HTTP в целом. У меня был пердеть мозг, когда задавал этот вопрос. Благодаря!
Приличный Дабблер
1
Переадресация в шаблоне PRG, тем не менее, происходит из-за признания того, что поддержание «семантики диалога» менее важно, чем предотвращение того, чтобы пользователи, пользующиеся популярностью, нажимали F5 и игнорирование предупреждения «который повторно отправит форму ...» из их браузер.
Carson63000
Достаточно справедливо, поэтому я упомянул перспективу REST.
Гэри Роу
5

Как правило, я бы сказал, что нет, на том основании, что, когда форма POST помещена с недопустимыми полями, в ответ вы обычно хотите использовать одну и ту же форму с тем же заполнением полей, а также некоторые сообщения об ошибках. Это было бы обременительно выполнять через POST / Redirect / GET - как бы вы обеспечили, чтобы на странице, возвращаемой GET, уже были записи пользователя в полях формы?

Carson63000
источник
2
Временно сохраняя результат в сеансе (на время одного последующего запроса)?
Приличный Дабблер
2
@fireeyedboy: да, это сделало бы это .. кажется, немного круто, хотя.
Carson63000