2013-11-26 7 views
10

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

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 documentation никогда не упоминает параметры POST, но также не говорит, что он не работает.

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

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

+0

Я просто заметил: 'Если метод действия определяет некоторые параметры, все эти значения параметров будут найдены в URI запроса, либо извлечены из самого пути URI, либо из строки запроса', поэтому я думаю, что это действительно не работает с Параметры POST. – Mattias

ответ

18

Route = разрешение параметров внутри URL = отправка параметров через GET.

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

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

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

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

Вместо этого вы должны сделать это с распространенной формой обработки способом, как описано в base form documentation:

маршрут:

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) 
} 
+0

Спасибо, файл журнала был одной из причин, по которым параметры GET неприемлемы. Так что, как я подозревал, автоматическая привязка параметров работает только для параметров GET, слишком плохо. – Mattias

+0

Это не столь драматичный подход всего за несколько строк, если вы будете использовать более продвинутую форму, т. Е. с предопределенными ограничениями вы дополнительно увеличите безопасность, вы можете просто проверить, требуется ли имя пользователя для длины или если это электронная почта и т. д .; wink.gif thumbs up! – biesior

+2

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

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