我通过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
但是Play!框架期望数组数据作为ids=0&ids=1&ids=2&ids=3
发送
是否有正确的方法来正确发送数据(或将数据作为控制器中的数组获取)?
到目前为止,我设法使其工作简单但在javascript中手动创建请求为String。
谢谢你的帮助。
一种方法(保持JavaScript代码完整)只是声明你的控制器方法如下:
public static void myMethod(@As("ids[]:")List<Long> ids) {
System.out.println(ids.get(0));
}
..输出是你所期望的:
[0, 1, 2, 3]
我不确定是否有更简单的方法,但你可以发送一个字符串并使用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);
这个解决方案对我有用。试试看,
// 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]);
}
只需将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 ...
}
});