【问题标题】:Play Framework and jQuery Ajax request with data as Array以数组形式播放框架和 jQuery Ajax 请求
【发布时间】:2012-01-13 18:41:43
【问题描述】:

我通过带有 Play Framework 后端的 jQuery 通过 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 中手动将请求创建为字符串。

感谢您的帮助。

【问题讨论】:

  • 能否设置数据为'data': {'ids': 0,'ids': 1,'ids': 2, 'ids': 3}?
  • @SKS,你试过吗?你最终会得到一个只有 { 'ids': 3 } 的地图,因为你正在用每个地图条目清除 id。
  • @marchaos: 是的,看我下面的帖子。我建议写一个js函数来手动设置查询字符串:(

标签: jquery ajax arrays playframework


【解决方案1】:

一种方法(保持您的 JavaScript 代码完整)就是像这样声明您的控制器方法:

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

.. 输出如你所愿:

[0, 1, 2, 3]

【讨论】:

  • 太好了!很遗憾,Play 没有一种“自然”的方式来做到这一点!也许我应该开张票问他们。谢谢你的想法。
【解决方案2】:

我不确定是否有更简单的方法,但您可以发送一个字符串并使用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);

【讨论】:

    【解决方案3】:

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

    // 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]);
    }
    

    【讨论】:

      【解决方案4】:

      只需将 traditional: true 添加到您的 jQuery.ajax 请求中,数组将作为 ids=0&amp;ids=1&amp;ids=2&amp;ids=3 发送

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多