rails响应跨域请求在本地开发,发现应用程序开发

时间:2012-08-04 02:04:23

标签: ruby-on-rails ruby api cross-domain spotify

所以我正在开发一个spotify应用程序,试图让它与我的本地rails应用程序API交谈。我尝试的时候除了req.status 0之外什么都得不到。

我认为它要么是spotify manifest.json文件的问题,要么不允许port:3000进入你在所需权限中设置的url,但它在文档中也说了以下内容。

https://developer.spotify.com/technologies/apps/tutorial/

  

如果您需要与外部网络API通信,只要您遵守“集成指南”中规定的规则,我们欢迎您。请注意,在与Web API交谈时,请求将来自原始sp:// $ APPNAME(因此sp://示例教程) - 确保您正在与之交谈的服务接受来自此类来源的请求。

所以,我不确定rails是否设置为不允许这种事情,或者是否将端口置于所需权限中的问题,但是我的请求

  var req = new XMLHttpRequest();
  req.open("GET", "http://127.0.0.1:3000/api/spotify/track/1.json", true);
  console.log(req);
  req.onreadystatechange = function() {

  console.log(req.status);
  console.log(req.readyState);
  if (req.readyState == 4) {
    if (req.status == 200) {
       console.log("Search complete!");
       console.log(req.responseText);
    }
    }
};

req.send();

始终返回状态0,例如:

var req = new XMLHttpRequest();
req.open("GET", "http://ws.audioscrobbler.com/2.0/?method=geo.getevents&location=" + city + "&api_key=YOUR_KEY_HERE", true);

req.onreadystatechange = function() {

    console.log(req.status);

    if (req.readyState == 4) {
      console.log(req);           
        if (req.status == 200) {
            console.log("Search complete!");
            console.log(req.responseText);
        }
    }
};

req.send();

至少会返回403响应。它就像请求没有被制作或什么?

任何人都知道可能会发生什么?

非常感谢!

2 个答案:

答案 0 :(得分:2)

当与Spotify应用程序中的外部服务交谈时,即使它们在本地计算机上运行,​​您也需要确保正确地准备好两件事:

  • 网址(或至少是主机)位于您的清单的RequiredPermissions部分。港口没关系。 http://127.0.0.1对你的情况应该没问题。

  • 服务器允许sp://your-app-id来源请求,如您在问题中粘贴的文档中所述。这可以通过在服务的HTTP响应中设置Access-Control-Allow-Origin标头来完成。人们经常将其设置为Access-Control-Allow-Origin: *以允许任何内容向其服务提出请求。

答案 1 :(得分:1)

感谢您的帮助,我弄明白了,我认为这是多方面的事情,其中​​一个主要因素是我以前没有尝试过的白痴时刻

首先,我必须在端口80上运行rails,显然如果我从127.0.0.1:3000访问我的网站,如果spotify应用程序请求127.0.0.1则不会起作用,除非我可以直接在浏览器,除非你在80上运行,否则你不能这样做。这是通过

完成的
rvmsudo rails server -p 80

需要使用rvmsudo,因为更改端口需要权限。

接下来我必须设置如上所述的访问控制允许来源,这可以通过在过滤器之前添加到您的app控制器中来完成在rails 3中完成,如下所示。

class ApplicationController < ActionController::Base

  logger.info "I SEE REQUEST"

  before_filter :cor

  def cor
    headers["Access-Control-Allow-Origin"] = "*"
    headers["Access-Control-Allow-Methods"] = %w{GET POST PUT DELETE}.join(",")
    headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
    head(:ok) if request.request_method == "OPTIONS"
  end
end

最后,也是最重要的(感叹),当你对清单文件进行更改时,你不能再点击并重新加载你的spotify应用程序,完全退出spotify并重新启动它!