rails 响应本地开发的跨域请求,spotify 应用程序开发
Posted
技术标签:
【中文标题】rails 响应本地开发的跨域请求,spotify 应用程序开发【英文标题】:rails responding to cross domain request developing locally, spotify app development 【发布时间】:2012-08-02 01:41:48 【问题描述】:所以我正在开发一个 spotify 应用程序,试图让它与我的本地 Rails 应用程序 API 对话。当我尝试时,除了 req.status 0 之外,我什么也得不到。
我认为这可能是 spotify manifest.json 文件的问题,不允许 port:3000 继续您在所需权限中设置的 url,但它还在他们的文档中说明了以下内容。
https://developer.spotify.com/technologies/apps/tutorial/
如果您需要与外部 Web API 对话,我们欢迎您,只要您遵守集成指南中设置的规则。请注意,当与 Web API 通信时,请求将来自源 sp://$APPNAME(我们的示例中是 sp://tutorial) - 确保您正在与之通信的服务接受来自此类源的请求。
所以,我不确定 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 响应。好像没有提出请求或其他什么?
有人知道会发生什么吗?
非常感谢!
【问题讨论】:
检查您的 Rails 应用程序是否在您的日志中被命中 只是说清楚,请求来自哪里?127.0.0.1:3000
只能在您的本地机器上接受!
是的,它来自 spotify 应用程序本身,我有自己的来自 spotify 应用程序的小控制台,据我所知,它是在我的本地机器的上下文中运行的。 - 我也只是尝试点击我的一个实时网站的主页,看看我是否能得到除了空白响应之外的任何东西,但我不能,得到同样的东西。所以我认为它可能是服务器设置或其他什么?嗯嗯。
尝试使用诸如 firebug 或 chrome dev 工具之类的网络检查器,以确保请求是从您的浏览器发送的(查找网络选项卡)
【参考方案1】:
感谢您的帮助,我明白了,我认为这是多方面的问题,其中一个主要的我是一个白痴时刻,因为没有早点尝试
首先,我必须在端口 80 上运行 rails,很明显,如果我从 127.0.0.1:3000 访问我的网站,如果 spotify 应用程序请求 127.0.0.1,那将无法正常工作,除非我可以直接在浏览器,除非您在 80 上运行,否则您无法使用。这是通过
rvmsudo rails server -p 80
需要使用 rvmsudo,因为更改端口需要权限。
接下来我必须设置访问控制允许来源,如上所述,这可以在 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"] = %wGET POST PUT DELETE.join(",")
headers["Access-Control-Allow-Headers"] = %wOrigin Accept Content-Type X-Requested-With X-CSRF-Token.join(",")
head(:ok) if request.request_method == "OPTIONS"
end
end
最后,也是最重要的(叹气),当您对清单文件进行更改时,您不能只右键单击并重新加载您的 Spotify 应用程序,完全退出 Spotify 并重新启动它!
【讨论】:
【参考方案2】:从 Spotify 应用程序与外部服务通信时,即使它们在您的本地计算机上运行,您也需要确保两件事正确:
URL(或至少是主机)位于清单的 RequiredPermissions
部分。端口无所谓。 http://127.0.0.1
应该适合您的情况。
服务器允许 sp://your-app-id
请求来源,如您在问题中粘贴的文档中所述。这是通过在服务的 HTTP 响应中设置 Access-Control-Allow-Origin
标头来完成的。人们经常将其设置为 Access-Control-Allow-Origin: *
以允许任何东西向他们的服务发出请求。
【讨论】:
以上是关于rails 响应本地开发的跨域请求,spotify 应用程序开发的主要内容,如果未能解决你的问题,请参考以下文章