【问题标题】:What's the best way to serialize an array and pass it through the get method序列化数组并通过get方法传递它的最佳方法是什么
【发布时间】:2012-06-27 07:04:30
【问题描述】:

所以我使用 ajax 请求来传递一些数据以进行过滤。

然后我使用 history.js,这样我就可以更改 url 并向浏览器添加状态,从而可以返回、前进等。这样,我可以使用 ajax 请求或普通请求过滤我的数据.到目前为止一切顺利。

我的问题是,在我通过ajax请求传递的数据中有一个数组:

function updateContent(url, state) {
    $.ajax({
        type: 'GET',
        data: {name: state.filter_name, num: state.filter_number, 
            data: state.filter_data, array: state.filter_array},
        url: url,
        success: function(msg) {
                $('#ajax').html(msg);
        }
    }); 
    
}

这将向该 URL 发出请求:

http: //localhost/Project/Controller/?filter_array%5B%5D=1&filter_array%5B%5D=50&filter_array%5B%5D=70.

我想将此 url 传递给 history.pushstate

如果我使用 jsenconde 然后手动构建 url,则 url 会略有不同,类似于:

http://localhost/Project/Controller/?filter_array=["1","50","70"]

虽然它更简洁,但我在某处读到不应在 url 中使用 [],但即使我使用这种方式,我也会得到两种类型的 GET url,ajax URL ?filter_array%5B%5D=1&filter_array%5B%5D=50&filter_array%5B%5D=70. 和 json url @987654326 @。

所以我只需要一个解决方案,让我只获得一种类型的 GET url,这样我就可以使用相同的 url 进行 ajax 和正常请求。

【问题讨论】:

  • 在 URL 中使用 [] 并没有什么错误,它只是与 PHP 以外的任何东西不兼容。但是,如果您在这里烦恼的是history.pushstate(),为什么不将数据存储在stateObj 中并在收到状态弹出事件时检查它而不是URL?这样,您可以使用 PHP 友好的 URL,并且仍然可以轻松访问 JS 中的数据。

标签: php jquery ajax codeigniter history.js


【解决方案1】:

传递值数组的标准方法是使用[] 重复传递名称(url 编码),如您的第一个示例所示。

您需要以符合此规则的方式生成您的 URL...

filter_array[]=1&filter_array[]=2&filter_array[]=3

当然,正如你所展示的那样编码......

filter_array%5B%5D=1&filter_array%5B%5D=2&filter_array%5B%5D=3

如果您坚持使用这种格式,您的代码将更加可移植(例如,ASP.Net 会像许多 PHP 库一样自动执行到 List 的转换)。

有什么原因不能生成这种格式的url?

这里的区别是一个是使用标准格式编码,一个是转换JSON

【讨论】:

  • [] 不是 the 标准方式 - 它甚至不是 a 标准方式,它只是 PHP 的方式。
  • @DaveRandom PHP、ASP.Net 和 RoR 都支持它。我承认我不了解其他人,所以会接受它可能不是 the 标准,但它绝对是 a 标准并且它有效。
  • 哦,它确实有效,并且受到许多系统的支持,但是当您无法引用 RFC 时,请注意不要发表“这是 the 标准”的言论,这是我的观点。缺乏标准会产生创造性的实施......
【解决方案2】:

jQuery 对 JSON 对象进行 URL 编码,因此没有非法字符。如果您想使用 javascript 检索该 GET 变量,则必须从 URL 中提取数据,对其进行 URL 解码,然后使用 JSON.parse() 将其转回 JavaScript 对象。

http://www.w3schools.com/jsref/jsref_encodeuri.asp

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2010-10-10
    • 2010-09-10
    • 2019-06-01
    相关资源
    最近更新 更多