Play Framework和jQuery Ajax请求,数据为Array

时间:2012-01-13 18:41:44

标签: jquery ajax arrays playframework

我通过jQuery使用Play Framework后端通过Ajax发送一个值数组,我遇到了问题。

以下是一个例子:

$.ajax ({
    'type':     'POST',
    'url':          '/url',
    'timeout':  5000,
    'data':     {'ids': [0, 1, 2, 3]},
    'dataType': 'json',
    'success':  function (oData) {
        // Process ...
    }
});

但是在Play!中,如果我执行了params.get("ids");,我得到一个空值,如果我也做了params.getAll("ids");

我知道问题出在哪里,jQuery将数据发送为:ids[]=0&ids[]=1&ids[]=2&ids[]=3 但是玩!框架期望数组数据以ids=0&ids=1&ids=2&ids=3

的形式发送

是否有正确的方法正确发送数据(或将数据作为控制器中的数组获取)?

到目前为止,我设法让它很简单,但是在javascript中手动创建了一个String请求。

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

一种方法(保持JavaScript代码完好无损)只是声明你的控制器方法:

public static void myMethod(@As("ids[]:")List<Long> ids) {
    System.out.println(ids.get(0));
}

..输出符合您的预期:

[0, 1, 2, 3]

答案 1 :(得分:1)

我不确定是否有更简单的方法,但您可以发送一个字符串并使用GSON解码,即:

$.ajax ({
    'type':     'POST',
    'url':          '/url',
    'timeout':  5000,
    'data':     {'ids': '[0, 1, 2, 3]'},
    'dataType': 'json',
    'success':  function (oData) {
        // Process ...
    }
});

在您的控制器中,您可以将字符串转换为数组:

// data would be "[0, 1, 2, 3]"
int[] intArray = gson.fromJson(data, int[].class);

答案 2 :(得分:1)

这个解决方案对我有用。试一试,

// Sending request
var params = {
    myArray: [1, 2, 3, 4]
};
var url = '@controllers.routes.AppController.jquery()';
$.post(url, params, function (data) {
    // Process response here
});

// Receiving request
Map<String, String[]> params = request().body().asFormUrlEncoded();
Logger.debug("Params : " + params.size());
for (Map.Entry<String, String[]> param : params.entrySet()) {
    Logger.debug(param.getKey() + " = " + param.getValue()[0]);
}

答案 3 :(得分:0)

只需将traditional: true添加到您的jQuery.ajax请求中,该数组将以ids=0&ids=1&ids=2&ids=3的形式发送

$.ajax ({
    traditional: true,
    type:        'POST',
    url:         '/url',
    timeout:     5000,
    data:        {'ids': [0, 1, 2, 3]},
    dataType:    'json',
    success:     function (oData) {
        // Process ...
    }
});