Почему запросы JSON к моему внешнему API отменяются в моем приложении Spotify? - PullRequest
5 голосов
/ 08 декабря 2011

Я создаю приложение Spotify, которое извлекает данные JSON из REST API, используя URL-адреса, такие как

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

Если я запускаю свое приложение в Chrome на своем рабочем столе (вне Spotify), запрос не отменяется, и все хорошо.

Что я делаю не так? Или, может быть, это ошибка (функция?) В предварительном выпуске Spotify?

Ответы [ 5 ]

9 голосов
/ 14 декабря 2011

Это может быть несколько вещей, я приведу их в порядок от самого простого до самого сложного.

  1. Убедитесь, что в вашем манифесте указан правильный RequiredPermissions .json
  2. Убедитесь, что ваш manifest.json имеет допустимую структуру json, вы можете сделать это на таких сайтах, как http://jsonlint.com/
  3. Убедитесь, что вы не храните файл с символом спецификации (невидимый байт вначало файла), это может привести к сбою анализа манифеста
  4. Убедитесь, что запрашиваемый сервер принимает ваше происхождение.Все приложения в Spotify имеют происхождение, например sp://appname, большинство серверов по умолчанию принимают протоколы http и https, поэтому вы можете установить Acces-Control-Allow-Origin на *, чтобы убедиться, что запрос не будет отменен.

Наконец, я хотел бы отметить, что, хотя запрос иногда отображается в инспекторе как отмененный, он все равно будет иметь правильный ответ, поэтому обязательно проверьте его еще раз.

Надеюсь, это поможет!

Редактировать: иногда, по какой-то странной причине, это также помогает установить URL, который вы запрашиваете в RequiredPermissions без префикса http:// или https://.

4 голосов
/ 02 января 2012

Еще одна вещь, которую нужно с осторожностью:

Если вы занимаетесь местным развитием. НЕ попробуйте выполнить вызовы ajax / getJSON для "localhost" или "127.0.0.1", используйте вместо этого IP-интерфейс Eth / WiFI .

Веб-механизм spotify либо блокирует эти идентификаторы локального хоста в запросах, либо петлевой интерфейс игнорируется, либо окна снова вмешиваются.

Это может быть очевидным для некоторых, но мне понадобилось время, чтобы понять это.

4 голосов
/ 12 декабря 2011

Вы пытались перезапустить Spotify, чтобы перезагрузить изменения в RequiredPermissions?Раньше у меня была похожая проблема, которая была решена после перезагрузки.

0 голосов
/ 23 января 2012

Одной из причин моей проблемы был персонаж Bom.

Чтобы исправить это, я использовал Notepad ++, Encode -> Encode в UTF-8 без BOM

0 голосов
/ 15 декабря 2011

Spotify использует хром внутри и, следовательно, придерживается политики Same Origin . Чтобы обойти это, используйте JSONP . Я бы рекомендовал установить политику происхождения на вашем веб-хосте, чтобы разрешить только Spotify.

...