我有以下与 jQuery 完美配合的请求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 方法将保持其当前形式。
建议了一些建议JSON.stringify(obj)
的解决方法,但 API 必须保持现有客户端可以访问,我们不能将其更改为接受 JSON,我们不应该这样做,许多 Rack 应用程序都支持这一点,而且似乎是一些一种标准(可能只是事实上的标准),这是一个示例(总的来说,它似乎可以按预期工作,但我无法更改后端服务器):
$.ajax({
url: 'http://localhost:3000/locations',
data: JSON.stringify({
"matching": [{
"name": "ottensen"
}]
}),
contentType: 'application/json',
dataType: 'json'
})
问题:因此我的问题是,我怎样才能让 jQuery 将相同的东西发送到curl
正在执行的服务器?
旁注(服务器端解决方法):服务器有这行神奇的代码,这让我非常非常难过:matching = params.fetch(:matching); matching = Array(matching.values) if matching.is_a?(Hash)
这是一个目前有效的解决方法,但我不想在我的代码中重复它。
还值得注意的是,我已经考虑实现一个 Rack 中间件来修复传递的 jQuery 样式对象,因此它们可以在 Rails 中按预期工作(也就是说,从看起来像这样的 jQuery 请求中重写参数,并修复它们Rails 应用程序不知道发生了什么)