Перенаправление с неверным статусом запроса

Я использую Play Framework v2.2.2 (scala) и пытаюсь выполнить перенаправление со статусом 400 (неверный запрос).

В настоящее время я делаю перенаправления, используя обратную маршрутизацию, например:

Redirect(Games.Controllers.routes.SportViewController.show)

Я хотел бы иметь возможность указать статус перенаправления. Я попытался добавить дополнительный аргумент к вызову, но получаю ошибку компиляции:

Перегруженное значение метода [Redirect] не может быть применено к (play.api.mvc.Call, Int)

В документации я заметил, что вы можете указать строковый uri со статусом перенаправления, однако я действительно хотел бы продолжать использовать обратную маршрутизацию в своем коде вместо того, чтобы повсюду использовать строковые значения uri.

Redirect("redirect/path", status = 400)

Любые идеи или предложения о том, как я могу выполнить перенаправление Bad Request (400) с использованием обратной маршрутизации? Я что-то пропустил в документации? Есть ли совершенно другой/лучший способ сделать это?

Огромное спасибо!


РЕДАКТИРОВАТЬ

Чтобы дать немного больше контекста, почему я спросил о перенаправлении с определенным статусом. Я обрабатываю сообщение формы. При успешной публикации (например, данные, опубликованные пользователем, действительны), затем перенаправить на маршрут X, а при неудачной публикации (например, пользовательские данные отсутствуют или недействительны) затем перенаправить на маршрут Y. Какой код состояния должен быть для неуспешных публикаций использовал?


person dbrown428    schedule 09.06.2014    source источник
comment
Разве это не должны быть два отдельных вопроса?   -  person Michael Zajac    schedule 14.06.2014


Ответы (2)


Это подпись интересующего вас Redirect (без измененного статуса):

def Redirect(call: Call): SimpleResult = Redirect(call.url) 

Он просто вызывает другую перегрузку, которая выполняет работу ноги:

def Redirect(url: String, queryString: Map[String, Seq[String]] = Map.empty, status: Int = SEE_OTHER)

Таким образом, мы могли бы легко создать нашу собственную перегрузку, которая вызывает вышеприведенную версию с нашим собственным контроллером:

def Redirect(call: Call, status: Int): SimpleResult = Redirect(call.url, Map.empty, status)
person Michael Zajac    schedule 09.06.2014
comment
Привет, LimbSoup, спасибо, что поделились. Это интересная идея. Я удивлен, что это не встроено в структуру. - person dbrown428; 10.06.2014

Действие Redirect следует использовать для перенаправления 3XX, как определено в спецификации HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html .

Когда вызывается действие Redirect, оно устанавливает заголовок Location (см. 14.30 Location), а также заголовок состояния 3xx. Браузер попытается загрузить URI из заголовка местоположения в качестве нового запроса и, таким образом, будет использовать код состояния HTTP конечного пункта назначения.

Перенаправления следует использовать только для

  • В конце успешной публикации формы, чтобы предотвратить дублирование отправки при нажатии кнопки «Обновить/Назад».
  • Часть контента перемещена и больше недоступна по старому URI.

Если вы хотите явно указать ошибку 400, вам нужно использовать действие BadRequest и отобразить страницу ошибки из вашего приложения.

def badAction = BadRequest {
  views.html.myError
}

Или, если вы хотите перенаправить на внешнюю страницу, сохраните существующий статус 3XX по умолчанию.

person Adam    schedule 09.06.2014
comment
Привет, Адам, спасибо за твой пост. То есть в случае неудачной публикации формы мне не следует использовать редирект? - person dbrown428; 10.06.2014
comment
Это зависит от варианта использования. Если публикация формы не удалась, обычно вы возвращаете пользователя к форме, показывающей предыдущие данные с выделенными ошибками, чтобы они могли их исправить. Редирект в этой ситуации не подходит. - person Adam; 10.06.2014
comment
Как бы вы порекомендовали вернуть пользователя в форму, если вы не используете перенаправление? - person dbrown428; 10.06.2014
comment
@ Адам, а как насчет перенаправления пользователей на форму входа (или что-то подобное), если они пытаются получить доступ к защищенной странице, но не аутентифицированы? Вы бы перенаправили их на URL-адрес для входа, но это скорее 4XX, не так ли? - person alapeno; 27.12.2015