2013-11-12 2 views
5

В моей routes:Playframework Обработка запроса на пост

POST  /forms/FormValidator1/validateForm      controllers.FormValidator1.validateForm(jsonForm:String) 

Существует метод управления определен для этого маршрута:

def validateForm(jsonForm:String) = Action { ... 

Затем я пытаюсь отправить запрос POST хромом Почтальон плагин (см рис выше).

Я использую:

URL:http://localhost:9000/forms/FormValidator1/validateForm
заголовки: Тип содержимого: приложения/JSON
JSON данные: {имя: "меня", фамилия: "мой"}

Итак, отправка этого запроса POST Я не могу связаться с методом контроллера указанным маршрутом/URL. Почему?

UPDATE:

достаточно занятно: после того, как я получил это работает на моем ноутбуке (см мой ответ ниже), а затем нажать его на GitHub и тянуть его на другую машину, она начинает работать по-другому. Теперь он жалуется, что Плохой запрос [Недопустимый XML] тем не менее я использую заголовок "application/json" и не менял ни одной строки кода после фиксации. Интересно, может быть, это ошибка .

enter image description here

+1

Там не много ходить здесь; можете ли вы показать нам ответ 400 Bad Request в полном объеме? Там часто есть ключ. – millhouse

ответ

3

Кажется, я получил его.

Здесь: 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 
+0

также связан с моим вопросом AngularJS: http: //stackoverflow.com/questions/19939218/angularjs-http-sending-post-request-fails – ses

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