【问题标题】:$.params vs JSON.stringify on Rails ajaxRails ajax 上的 $.params 与 JSON.stringify
【发布时间】:2014-09-17 10:29:59
【问题描述】:

在尝试对 Rails 进行 AJAX 调用时,我对 JSON.stringify()$.param 有一些疑问 此代码有效

$.ajax({
  url: '/api/v1/login',
  dataType: 'application/json',
  method: 'post',
  data: $.param({"user": attrs}),
  success: function(a,b,c) {
    alert(JSON.parse(b));
  }
});

这段代码没有

  $.ajax({
    url: '/api/v1/login',
    dataType: 'application/json',
    method: 'post',
    data: $.JSON.stringify({"user": attrs}),
    success: function(a,b,c) {
      alert(JSON.parse(b));
    }
  });

$.param({"user": attrs}) 返回user%5Busername%5D=ABC&user%5Bpassword%5D=123456 JSON.stringify({"user": attrs}) 返回{"user":{"username":"triet","password":"123456"}}

我认为JSON.stringify 应该可以工作,但是当我咨询rails 控制台时,它给了我{"{\"user\":{\"username\":\"triet\",\"password\":\"123456\"}}"=>"[FILTERED]"}

谁能告诉我为什么会有 [FILTERED] 部分?我找不到任何关于它的文档提及。谢谢

【问题讨论】:

  • 在不使用$.paramJSON.stringify 的情况下无法传递对象的总体问题是什么?
  • data: $.param({"user": attrs}) 很酷,不知道你能做到。 @charlietfl - 这在 Rails 中很有用,其中属性只有在使用对象名称命名时才能被批量分配。
  • @maxpleaner jQuery 会在内部为你解析数据,在这种情况下不需要它

标签: jquery ruby-on-rails ajax json


【解决方案1】:

我怀疑data 选项仅将字符串作为序列化表示,即user%5Busername%5D=ABC&user%5Bpassword%5D=123456

所以如果你将data设置为$.JSON.stringify({"user": attrs}),即"{\"user\":{\"username\":\"triet\",\"password\":\"123456\"}}",则data的格式是错误的。

如果您需要发送 JSON 数据,那么您应该在没有 JSON.stringify 的情况下像 Object 这样使用它:

$.ajax({
  url: '/api/v1/login',
  dataType: 'application/json',
  method: 'post',
  data: {"user": attrs},
  success: function(a,b,c) {
    alert(JSON.parse(b));
  }
});

这个请求应该有效。

所以我不认为问题出在[FILTERED],因为这只是 Rails 过滤器安全值 only 来自日志。数据没有被触及。

【讨论】:

  • 您的代码有效,谢谢。当data 不是那么简单时,您有什么建议,我应该使用$.param 吗?
  • 所以我不认为问题出在 [FILTERED] 因为这只是 Rails 过滤器仅从日志中保护值。数据没有被触及。 我的意思是 JSON 末尾的 [FILTERED],而不是 Rails 收到密码时自动过滤掉的那个。
  • 当数据不是那么简单时,您有什么建议,我应该使用 $.param 吗? - 如果您的数据是 Objectajax 会将其转换为适当的参数字符串本身。因此,您几乎总是可以将data 设置为您的Object。在我的实践中,我以前从未使用过$.param
  • 我的意思是 JSON 末尾的 [FILTERED],而不是 Rails 收到密码时自动过滤掉的那个。 - 在我看来:因为你的 @987654338 @ 格式不正确,$.ajax 方法威胁它作为参数的键名,该键的值是 null。 Rails 看到该密钥包含“密码”字符串,并认为其值是安全的并对其进行过滤。您可以使用 Firebug(或其他)查​​看 $.ajax 方法发送的请求,我确定我的猜测是正确的,并且有一个带有 "{\"user\":{\"username\":\"triet\",\"password\":\"123456\"}}" 键和 null 值的参数。
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多