【问题标题】:Using HTTP PUT to send JSON with Jquery and Rails 3使用 HTTP PUT 通过 Jquery 和 Rails 3 发送 JSON
【发布时间】:2011-04-29 18:53:13
【问题描述】:

HTTP PUT 并非完全跨浏览器,因此 Rails(我使用的是 Rails 3)支持使用 POST 并传递 _method 查询参数。这很好,但在发送 JSON 时似乎不起作用。

示例:

$.ajax({
    url: window.location.pathname,
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({_method:'PUT', page:{my_data: 1}),
    dataType: 'json'
});

当 Rails 看到这一点时,它无法识别“_method”覆盖,因为它是以 JSON 格式传递的(也许转换是稍后的?)。 Rails 返回一个错误“没有路由匹配......”说它找不到路由(到资源),我假设因为它不匹配 REST update=HTTP PUT 动词,我什至尝试将它附加到网址:?_method=PUT,但得到了相同的结果。

似乎唯一起作用的是设置 HTTP 标头:

$.ajax({
    url: window.location.pathname,
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({my_data: 1}),
    dataType: 'json',
    beforeSend: function(xhr){
        xhr.setRequestHeader("X-Http-Method-Override","put");
    }
});

设置 HTTP 覆盖标头是最好的方法吗?

【问题讨论】:

  • 看起来 4 年前的大多数 Web 浏览器都支持直接设置方法(XmlHTTPRequests 的 PUT POST DELETE),所以可以肯定地说它可以在不设置额外标头或 _method 的情况下正常工作范围。我最初的错误是由于在路由到 rails 时混淆了 PUT / POST。看起来 4 年前的大多数 Web 浏览器都支持这个(PUT POST DELETE for XmlHTTPRequests),所以可以肯定地说它工作得很好。我最初的错误是由于在路由到 rails 时混淆了 PUT / POST。
  • 你有没有弄清楚为什么顶级版本不起作用?

标签: jquery ruby-on-rails ajax http rest


【解决方案1】:

AJAX 直接支持 PUT 动词,所以为什么要打扰 _method 和自定义 HTTP 标头:

$.ajax({
    url: window.location.pathname,
    type: 'PUT',
    contentType: 'application/json',
    data: JSON.stringify({ page: { my_data: 1 }),
    dataType: 'json'
});

还要确保您尊重 same origin policy 或 jquery 可能会尝试使用仅适用于 GET 动词的 JSONP。

【讨论】:

  • 并非所有浏览器都支持 XmlHTTPRequest 中的 PUTDELETE 方法,但如果您以现代浏览器为目标,请使用它。
  • HTTP 规范描述了 PUT、POST、... AJAX 只是技术的集合。不过,大多数现代浏览器支持 HTTP PUT 似乎是对的(经过多次环顾后)。
  • 看起来 4 年前的大多数网络浏览器都支持这个(PUT POST DELETE for XmlHTTPRequests),所以可以肯定地说它工作得很好。我最初的错误是由于在路由到 rails 时混淆了 PUT / POST。
猜你喜欢
  • 2022-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多