【发布时间】:2012-01-15 18:20:14
【问题描述】:
我正在构建一个 Spotify 应用程序,它使用诸如
之类的 URL 从 REST API 中提取 JSON 数据http://www.mydomain.com/api/command?option=value
在我的 Spotify 应用清单中,我为我的 API 主机设置了所需的权限:
"RequiredPermissions": [ "http://*.mydomain.com" ]
我还在我的 API 的响应标头中配置了跨域资源共享。这是一个真实的例子:
Server: nginx/0.7.65
Date: Thu, 08 Dec 2011 09:07:16 GMT
Content-Type: application/json
Connection: keep-alive
X-Powered-By: Mojolicious (Perl)
Set-Cookie: mojolicious=eyJwcmVmcyI6e30sImZpbHRlcnMiOnsicGllciI6eyJzb3VyY2VzIjpbMjBdfSwiZWxlYyI6eyJzb3VyY2VzIjpbMTMsMTddLCJ4dGFncyI6WyJzaG9lZ2F6ZSJdLCJ0YWdzIjpbImVsZWN0cm9uaWMiXX0sInB1bmtkdWIiOnsieHRhZ3MiOlsicmVnZ2FlIl0sInRhZ3MiOlsicHVuayIsImR1YiJdfX0sImV4cGlyZXMiOjEzMjMzMzg4MzZ9--c6d6214525b5d56785eebc99217394a1; Version=1; Path=/; expires=Thu, 08 Dec 2011 10:07:16 GMT
Content-Length: 23381
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: *
200 OK
在 Spotify 的 chrome 检查器网络选项卡中,我看到请求被取消:
Name: command www.mydomain.net/api
Method: GET
Status Text: (canceled)
Type: undefined
Initiator: jquery-1.js:7180 (Script)
Size Content: 13B (0B)
Time Latency: 21ms (0.0 days)
如果我在桌面(Spotify 之外)的 Chrome 中运行我的应用,请求不会被取消,一切都很好。
我做错了什么?或者这可能是 Spotify 预览版中的一个错误(功能?)?
【问题讨论】:
-
我会尝试做的第一件事是使用 Wireshark 之类的工具分析 Spotify 发出的实际请求。然后您可以验证 a) Spotify 应用程序正在发送有效的 Origin 标头(CORS 需要该标头)并且 b) 您可以看到 Spotify 发送的任何自定义请求标头。请注意,CORS 规范不允许将“*”作为 Access-Control-Allow-Headers 标头的值。我建议回显您在 Access-Control-Request-Headers 中收到的参数。
-
我遇到了同样的问题,正如上面所说的,Access-Control-Allow-Headers 是我遇到的问题。我更改了我的服务器以将标头设置为“*”并且它有效。
-
monsur - 我会尝试使用 wireshark,但 Chrome 会显示传出请求并且没有异常的标头。 slurmomatic - 我已经将允许标题设置为“*”。您对 Spotify 有意见吗?
-
实际上,我的意思是“访问控制允许来源”。之前访问我的 API 时,我也收到了取消的消息。将 Allow-Origin 设置为 * 它可以工作(当然我还必须在清单中设置 RequiredPermissions)。
-
原来我的问题出在清单文件上——CORS 配置正确——见下文。