为什么在我的Spotify应用程序中取消对外部API的JSON请求?

时间:2011-12-08 09:36:19

标签: json api cors spotify

我正在构建一个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 inspector网络标签中,我看到请求被取消:

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)

Chrome inspector snapshot

如果我在桌面上(在Spotify之外)在Chrome中运行我的应用,则请求不会被取消,一切都很好。

我做错了什么?或者这可能是Spotify预览版中的一个错误(功能?)?

5 个答案:

答案 0 :(得分:9)

有几件事可能会导致这种情况,我会把它们从最容易解决到最难解决。

  1. 检查manifest.json
  2. 中是否有正确的RequiredPermissions
  3. 检查您的manifest.json是否有有效的json strjcture,您可以在http://jsonlint.com/等网站上执行此操作
  4. 确保您没有使用BOM字符存储文件(文件开头的不可见字节),这可能会导致清单解析失败
  5. 确保您要查询的服务器接受您的来源。 Spotify中的所有应用都有sp://appname的来源,大多数服务器默认只接受http和https协议,因此您可以将Acces-Control-Allow-Origin设置为*以确保请求无法获取取消。
  6. 最后,我想指出,即使请求有时会在检查员中显示为已取消,但它仍然会有正确的响应,因此请务必仔细检查。

    希望这有帮助!

    修改:有时候,出于某种奇怪的原因,在RequiredPermissionshttp://前置https://的情况下设置您要求的网址也很有帮助。

答案 1 :(得分:4)

您是否尝试重新启动Spotify以将更改重新加载到RequiredPermissions?我曾经有一个类似的问题,在重新启动后解决了。

答案 2 :(得分:4)

另一件要警惕的事情是:

如果您正在进行本地开发。 NOT 尝试向“localhost”或“127.0.0.1”发出ajax / getJSON调用,使用您的Eth / WiFI接口IP

spotify Web引擎会阻止请求中的这些localhost标识符,或忽略环回接口,或者Windows再次受到干扰。

对某些人来说这可能是显而易见的,但我花了一些时间才弄明白。

答案 3 :(得分:0)

Spotify在内部使用Chromium,因此遵守Same Origin政策。要绕过它,请使用JSONP。我建议您在webhost上设置原始策略,以仅允许Spotify。

答案 4 :(得分:0)

导致我问题的是Bom角色。

为了解决我使用Notepad ++,Encode - >在没有BOM的情况下以UTF-8编码