2012-04-25 4 views
9

Должен сказать, что я немного смущен тем, как обрабатывать параметр запроса, используя новую Play Framework 2. Данные поступают из разных источников относительно того, как делается запрос. До сих пор, вот возможности:Как работает запрос в Play Framework 2?

1 - Если вы делаете простой GET:

ctx().request().queryString() 

2 - Если вы делаете POST с помощью формы HTML:

Форма:

<form method="post" action="/"> 
    <input type="hidden" name="foo" value="bar" /> 
    <input type="hidden" name="t" value="1" /> 
    <input type="hidden" name="bool" value="true" /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

метод:

public static Result test() { 
    ctx().request().queryString();    // {} ; As expected 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // contains data 
    ctx().request().body().asJson();   // empty 
    return ok(); 
} 

Это кажется нормальным.

Теперь, если я добавлю @BodyParser.Of(BodyParser.Json.class) (предположу, я принимаю как Ajax POST и обычную почту для запасного варианта в случае Non-JS):

@BodyParser.Of(BodyParser.Json.class) 
public static Result test() { 
    ctx().request().queryString();    // {} ; as Expected 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // empty : Shouldn't this contains data since I posted them via a simple form ?! 
    ctx().request().body().asJson();   // empty 
    return ok(); 
} 

И потом, черт hapened: Как я могу получить значение а простая форма, если ни одна из них не заполнена (asJson, asFormUrlEncoded и т. д.)?!

3 - Если вы делаете POST с помощью AJAX:

// Code in JS used : 
$.ajax({ 
    'url': '/', 
    'dataType': 'json', 
    'type': 'POST', 
    'data': {'foo': 'bar', 't': 1, 'bool': true} 
}); 

Результат:

public static Result test() { 
    ctx().request().queryString();    // {} 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // contains data 
    ctx().request().body().asJson();   // empty 
    return ok(); 
} 

С @BodyParser.Of(BodyParser.Json.class):

@BodyParser.Of(BodyParser.Json.class) 
public static Result test() { 
    ctx().request().queryString();    // {} 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // empty 
    ctx().request().body().asJson();   // empty : Shouldn't this contains data since I espect JSON ?! 
    return ok(); 
} 

Здесь несогласованности является asJson() метод, который должен возвращают данные, поскольку, согласно документу

Примечание: таким образом, 400 HTTP-ответ будет автоматически возвращен для запросов без JSON. (Http://www.playframework.org/documentation/2.0/JavaJsonRequests)

То, что я хотел бы знать, что это лучший декоратор + метод для POST, который будет принимать простую почту от HTML или запрос Ajax с POST?

ответ

7

Я бы рекомендовал использовать классы форм, предусмотренные в PlayFramework. Форма свяжет свои значения с предоставленными данными запроса.

Есть две разные реализации Формы:

  1. DynamicForm: POST данных доступны через методу Карты Accessors
  2. Форма: общий вид формы будет отображать данные POST к экземпляру класса сущностей [more information]

    Форма также предоставляет некоторые полезные функции, такие как автоматическое преобразование типов, валидация, отчет об ошибках и т. Д.

простой пример с динамической форме: запрос

Аякса:

$.post("@routes.Application.movetodo()", 
    { "id": 123, "destination": destination }, function(data) 
     { 
      // do something when request was successfull 
     }); 

Маршруты файла: реализация

GET /       controllers.Application.index() 
POST /movetodo     controllers.Application.movetodo() 

Контроллер:

public static Result movetodo() 
{ 
    DynamicForm data = form().bindFromRequest(); // will read each parameter from post and provide their values through map accessor methods 
    // accessing a not defined parameter will result in null 
    String id = data.get("id"); 
    String destination = data.get("destination"); 

    return ok(); 
} 
+0

Nice one! DynamicForm сделал мой день! Благодаря! –

+1

Мне пришлось изменить 'form(). BindFromRequest()' to 'Form.form(). BindFromRequest()' – sissonb

+1

Я получаю [NullPointerException: null] при выполнении: \t \t DynamicForm data = Form.form(). BindFromRequest () ;. – blee908

0

Причина, по которой asJson() будет пуста, заключается в том, что по умолчанию $ .ajax отправит запрос с типом контента, установленным на 'application/x-www-form-urlencoded; charset = UTF-8 '. Вы должны установить его на 'application/json; charset = utf-8 ':

$.ajax({ 
    contentType: "application/json; charset=utf-8", 
    ... 
}) 
Смежные вопросы