jQuery:Rails上的跨域POST

时间:2014-01-19 12:21:52

标签: jquery ruby-on-rails cross-domain

我正在尝试使用以下代码向其他域发送帖子请求

  $.ajax({
    url: "http://domainName.com/api/v1/statistics/1",
    crossDomain: true,
    type: 'POST',
    dataType: 'jsonp'
  });

但是它给了我错误(404)并且似乎它将请求视为获取请求,无论什么

2 个答案:

答案 0 :(得分:4)

您无法通过JSONP进行POST。你只能使用GET。

域名还应包含:http://以访问外部文档。我希望你知道你必须创建一个使用JSONP的函数。默认的回调函数称为callback,因此您的响应应该是:

callback({ "data" : "data"});

回调函数?callback=?将自动添加到URL中。如果你有重写,你必须使用$_GET['callback']来获得回调函数。

来自jQuery docs

  

“jsonp”:使用JSONP加载JSON块。添加一个额外的   “?回调=?”到URL的末尾以指定回调。禁用   通过将查询字符串参数“_ = [TIMESTAMP]”附加到缓存来缓存   URL除非cache选项设置为true。

修改

您的请求将类似于:

$.ajax({
    url: "http://domainName.com/api/v1/statistics/1",
    crossDomain: true,
    dataType: 'jsonp',
    jsonp : "mycallback",
    success : function(data){
        console.log(data.thiskey); // Will log OK
    }
});

现在API的请求URL将如下所示(jQuery将附加?callback=mycallback):

http://domainName.com/api/v1/statistics/1?callback=mycallback

在您的响应中,您必须创建一个函数调用,以便调用jQuery Ajax函数。这个结果需要看起来像这样:

mycallback({ thiskey : "OK" }); // The data in this call can be retreived at the success function

在成功功能中,您可以检索数据,如:

success : function(data){
    console.log(data.thiskey); // Will log OK
}

答案 1 :(得分:1)

CORS

根据Niels的回答,您必须明白跨域数据发送取决于“目标”域的CORS policy

基本上,“外来”ajax请求默认被服务器的中间件拒绝,除非你使用某种CORS中间件来创建一些端点来访问

如果您发现404错误,则应考虑使用Rack-CORS之类的内容为您的应用提供跨域来源支持(允许跨域异步数据传输)< / p>