为啥我的 Spotify 应用程序中取消了对我的外部 API 的 JSON 请求?

Posted

技术标签:

【中文标题】为啥我的 Spotify 应用程序中取消了对我的外部 API 的 JSON 请求?【英文标题】:Why are JSON requests to my external API being cancelled in my Spotify App?为什么我的 Spotify 应用程序中取消了对我的外部 API 的 JSON 请求? 【发布时间】: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 配置正确——见下文。 【参考方案1】:

有几件事可能会导致这种情况,我将按照从最容易解决到最难解决的顺序排列。

    检查 manifest.json 中的 RequiredPermissions 是否正确 检查你的manifest.json是否有一个有效的json结构,你可以在http://jsonlint.com/这样的网站上做这个 确保您没有使用 BOM 字符(文件开头的不可见字节)存储文件,这可能会导致清单解析失败 确保您查询的服务器接受您的来源。 Spotify 中的所有应用都有sp://appname 这样的来源,大多数服务器默认只接受http 和https 协议,因此您可以将Acces-Control-Allow-Origin 设置为* 以确保请求不会被取消。

最后,我想指出,即使检查器中的请求有时显示为已取消,它仍然会有正确的响应,因此请务必仔细检查。

希望这会有所帮助!

编辑:有时,出于某种奇怪的原因,它也有助于在 RequiredPermissions 中设置您请求的 URL,而无需在前面添加 http://https://

【讨论】:

感谢这份清单 - 问题原来是我的清单文件中的无效 json 结构。 对我来说,这既是无效的 json,也不是重新启动模糊的整个客户端。【参考方案2】:

您是否尝试过重新启动 Spotify 以重新加载对 RequiredPermissions 的更改?我曾经遇到过类似的问题,重启后就解决了。

【讨论】:

+1 - 我刚刚遇到了与 OP 完全相同的问题,Chiel 列表中的所有内容都已检查,重新启动 Spotify 即可解决问题。【参考方案3】:

还有一点需要注意:

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

spotify 网络引擎要么在请求中阻止这些 localhost 标识符,要么忽略环回接口,或者 windows 再次受到干扰。

这对某些人来说可能很明显,但我花了一段时间才弄明白。

【讨论】:

我可以证明这仍然是一个问题。我在“音乐应用黑客周末”上受到了打击。应该早点打到。 :)【参考方案4】:

Spotify 在内部使用 Chromium,因此遵守 Same Origin 政策。要绕过它,请使用JSONP。我建议将您的虚拟主机上的源策略设置为仅允许 Spotify。

【讨论】:

JSON P 是一种选择,但 Chrome 也支持 CORS【参考方案5】:

导致我出现问题的原因是 Bom 角色。

为了解决我使用 Notepad++ 的问题,Encode -> Encode in UTF-8 without BOM

【讨论】:

以上是关于为啥我的 Spotify 应用程序中取消了对我的外部 API 的 JSON 请求?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的回调不能与 axios 库一起使用?

为啥我的 POST 请求仅对我的 API 不起作用?

为啥在我的 Paypal 沙盒上的 ios 应用程序中,买家可以取消付款?

如果取消,为啥我的 SaveFileDialog 会再次显示?

为啥我从 Spotify 元数据 api 获得间歇性结果?

为啥我的 UIViewController 失去了对打开模式 ViewController 的引用?