Кажется, я получил его.
Здесь: https://groups.google.com/forum/#!topic/play-framework/XH3ulCys_co
И здесь: https://groups.google.com/forum/#!msg/play-framework/M97vBcvvL58/216pTqm22HcJ
Существует wrong
и correct
способ объяснил:
Doesn't work: curl -d "name=sam" http://localhost:9000/test
Works: curl -d "" http://localhost:9000/test?name=sam
Это способ, как POST PARAMS являются passing..in игры. (вторая ссылка объясняется ПОЧЕМУ):
Иногда приходится идти на компромиссы. В Play 1 вы можете связать свои параметры с любым параметром, извлеченным из пути URL, строки запроса или даже тела запроса. Это было очень продуктивно, но у у вас не было способа контролировать способ загрузки формы. Я имею в виду, если пользователь загружает большой файл, необходимый для загрузки всего запроса в память , чтобы иметь возможность его обрабатывать.
В Play 2 вы можете управлять представлением тела запроса. Вы можете отклонить раньше, если что-то не так с пользователем, вы можете обрабатывать большие файлы или потоки , не заполняя память более чем одним HTTP chunk ... Вы получаете высокий контроль над тем, что происходит, и это может помочь вам в масштабе вы обслуживаете.Но другая сторона монеты состоит в том, что при отправке запроса Play 2 использует заголовок запроса для принятия своего решения : тело запроса еще не доступно, следовательно, неспособность напрямую связать параметр действия с параметр, извлеченный из тела запроса.
UPDATE: достаточно занятно: после того, как я получил это работает на моем ноутбуке, а затем вставьте его на GitHub и вытащить его на другую машину, она начинает работать по-другому. Теперь он жалуется, чем Плохой запрос is [Invalid XML] тем не менее я использую заголовок "application/json"
и не менял ни одной строки кода после фиксации.
UPDATE 2
Так что я установил его так:
На угловой стороне (мы даже можем комментировать dataType
и headers
):
var data = $scope.fields
$http({
url: '/forms/FormValidator1/validateForm',
method: "POST",
//dataType: "json",
data: data,
//headers: {'Content-Type': 'application/json'}
}).success(function (data, status, headers, config) {
console.log("good")
}).error(function (data, status, headers, config) {
console.log("something wrong")
});
На playFramework стороне: (использование BodyParser)
def validateForm = Action { request =>
val body: AnyContent = request.body
val jsonBody: Option[JsValue] = body.asJson
// Expecting text body
jsonBody.map { jsValue =>
val name = (jsValue \ "name")
val surname = (jsValue \ "surname")
....
}
Маршруты (не определяют параметры на всех!):
POST /forms/FormValidator1/validateForm controllers.FormValidator1.validateForm
Там не много ходить здесь; можете ли вы показать нам ответ 400 Bad Request в полном объеме? Там часто есть ключ. – millhouse