使用jQuery的可枚举GET和POST参数(给出curl示例)

时间:2012-10-09 23:24:38

标签: jquery ruby-on-rails ajax encoding rack

我有以下请求与curl完美配合,但我无法使用jQuery的jQuery.ajax函数系列:

curl -v -s -X GET -d 'matching[][name]=ottensen' http://localhost:3000/locations

诀窍是matching[][name]=ottensen。当应用程序服务器解释时,这会产生以下内容:

params: { "matching" => [{"name" => "ottensen"}] }

换句话说,我已经通过了哈希数组。

curl语法似乎很奇怪,但也受到广泛支持。

我用jQuery(最新)尝试了以下内容:

$.ajax({
    url: 'http://localhost:3000/locations',
    data: {
        "matching": [{
            "name": "ottensen"
        }]
    })
})   

还有其他各种错综复杂的组合,不幸的是jQuery.serialize并不能很好地发挥作用,但是文档确实提到了:

  

注意:因为没有普遍认可的规范   param字符串,不可能编码复杂的数据结构   以适合所有语言的方式使用此方法   支持这样的投入。直到有这样的时间,$ .param   方法将保持其当前形式。

建议使用一些建议的JSON.stringify(obj)变通方法,但现有客户端仍然可以访问API,我们无法将其更改为接受JSON,我们不应该这样做,这得到许多人的支持机架应用程序,似乎是某种标准(可能只是一个事实上的标准),这里是一个例子(大体上似乎按照人们的预期工作,但我不能改变后端服务器):

$.ajax({
    url: 'http://localhost:3000/locations',
    data: JSON.stringify({
        "matching": [{
            "name": "ottensen"
        }]
    }),
    contentType: 'application/json',
    dataType: 'json'
})

问题:因此,我的问题是,如何让jQuery将相同的内容发送到curl正在执行的服务器?

Side Note(Serverside解决方法):服务器拥有这条神奇的代码,这让我非常非常伤心:matching = params.fetch(:matching); matching = Array(matching.values) if matching.is_a?(Hash),这是一个现在适用的解决方法,但我我宁愿不必在整个代码中复制它。

值得注意的是,我已经考虑过实现一个Rack中间件来修复传递的jQuery样式对象,因此它们可以像Rails那样工作(也就是说,从一个看起来像这样的jQuery请求中重写params,并且修复它们,以便Rails应用程序不知道发生了什么事情)

0 个答案:

没有答案