Использование параметров маршрута POST в Play Framework

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

POST    /v1/accounts/login          controllers.v1.Accounts.login(username: String, password: String)

и мой контроллер выглядит следующим образом:

object Accounts extends Controller {
  def login(username: String, password: String) = Action {
    Ok("Foo " + username)
  }
}

Когда я тестирую этот маршрут с помощью Chromes Advance REST Client, он работает только для параметров GET, а не если я отправлю его как application/x-www-form-urlencoded форму POST данных.

Документация Play Framework никогда не упоминает параметры POST, но также не говорит, что она не работает.

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

Нет ли способа привязать параметры POST с помощью файла маршрутов?

Ответ 1

Маршрут = разрешение параметров внутри URL = отправка параметров с помощью GET.

Это означает, что вы пытаетесь отправить запрос POST с помощью... GET params... где смысл?

Джеймс Ропер объясняет, что:

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

С точки зрения безопасности это определенно плохая идея оставить учетные данные в журналах каждой машины на пути клиента.

Вместо этого вы должны сделать это с обычным способом обработки формы, как описано в документации базовой формы:

Маршрут:

POST    /v1/accounts/login      controllers.v1.Accounts.login

Действие:

val userForm = Form(
  tuple(
    "username" -> text,
    "password" -> text
  )
)

def login = Action { implicit request =>
  val (username, password) = userForm.bindFromRequest.get
  Ok("Hello " + username + ", you're trying to login with: " + password)
}