2011-12-08 16 views
5

Estoy construyendo una aplicación de Spotify que toma los datos JSON de una API REST, usando direcciones URL como¿Por qué se cancelan las solicitudes JSON a mi API externa en mi aplicación Spotify?

http://www.mydomain.com/api/command?option=value 

En mi Spotify aplicación manifiesta he puesto los permisos requeridos para mi anfitrión API:

"RequiredPermissions": [ "http://*.mydomain.com" ] 

También he configurado Compartir recursos de origen cruzado en los encabezados de respuesta de mi API. Aquí está un ejemplo real:

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 

En Spotify, en la pestaña de la red inspector de cromo, veo que la solicitud está siendo cancelada:

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

Si funciono mi aplicación en Chrome en mi escritorio (fuera de Spotify) la solicitud no se cancela y todo está bien.

¿Qué estoy haciendo mal? O tal vez este es un error (¿función?) En la versión preliminar de Spotify.

+1

Lo primero que me gustaría tratar de hacer es analizar la solicitud real que está realizando Spotify usando una herramienta como Wireshark. Luego puede verificar que a) la aplicación Spotify esté enviando un encabezado válido de origen (que se requiere para CORS) yb) puede ver los encabezados de solicitud personalizados enviados por Spotify. Tenga en cuenta que la especificación CORS no permite '*' como un valor para el encabezado Access-Control-Allow-Headers. Recomendaría repetir los parámetros que recibes en Access-Control-Request-Headers. – monsur

+0

Tuve el mismo problema y, como monsur dijo anteriormente, el problema fue el acceso-control-permitir-encabezados. Cambié mi servidor para configurar el encabezado a "*" y funcionó. – slurmomatic

+0

monsur - Probaré wireshark, pero Chrome muestra la solicitud saliente y no hay encabezados inusuales. slurmomatic: ya tengo los encabezados de permiso configurados en "*". ¿Tu problema fue con Spotify? – nick

Respuesta

9

Un par de cosas pueden causar esto, las pondré en orden de la manera más fácil a la más difícil.

  1. Compruebe que ha recibido la correcta RequiredPermissions en su manifest.json
  2. Compruebe que el manifest.json tiene una strjcture JSON válida, puede hacerlo en sitios web como http://jsonlint.com/
  3. Asegúrese de que no está almacenar el archivo con un carácter BOM (byte invisible al inicio del archivo), esto puede hacer que el análisis del manifiesto falle
  4. Asegúrese de que el servidor que está consultando acepta su origen. Todas las aplicaciones en Spotify tienen un origen como sp://appname, la mayoría de los servidores solo aceptan protocolos http y https de forma predeterminada, por lo que puede configurar el Acces-Control-Allow-Origin en * para asegurarse de que la solicitud no se cancele.

Por último, me gustaría señalar que aunque a veces se muestre una solicitud en el inspector como cancelada, seguirá teniendo una respuesta correcta, así que asegúrese de verificarla también.

Espero que esto ayude!

Editar: a veces, por alguna extraña razón, sino que también ayuda a establecer la dirección URL que está solicitando en RequiredPermissions sin los http:// o https:// antepuesto.

+1

Gracias por esta lista de comprobación: el problema resultó ser una estructura json no válida en mi archivo de manifiesto. – nick

+0

Para mí, fue tanto inválido como no reiniciando todo el cliente que se confundió. – Gustav

4

¿Ha intentado reiniciar Spotify para volver a cargar los cambios en RequiredPermissions? Solía ​​tener un problema similar que se resolvió en un reinicio.

+0

+1 - Simplemente tenía exactamente el mismo problema que el OP, todo en la lista de Chiel se desprotegió, reiniciar Spotify hizo el truco. –

0

Spotify utiliza Chromium en el interior y por lo tanto se adhiere a la política Same Origin. Para evitarlo, use JSONP. Recomiendo establecer la política de origen en tu servidor web para permitir solo a Spotify.

+0

JSON P es una opción, pero Chrome también es compatible con CORS – nick

4

Otra cosa a tener cuidado con:

Si usted está haciendo el desarrollo local.Haga NO intente emitir sus llamadas ajax/getJSON a "localhost" o "127.0.0.1", utilice su interfaz de red Eth/WiFI en su lugar.

El motor web spotify bloquea estos identificadores de host local en las solicitudes o se ignora la interfaz de bucle invertido o Windows ha interferido nuevamente.

Esto puede ser evidente para algunos, pero me tomó un tiempo darme cuenta.

+0

Puedo dar fe de que esto sigue siendo un problema. Estoy siendo golpeado por esto en el "Fin de semana de Hack Music Apps". Debería haber golpeado tan pronto. :) – Abel

0

El que causaba mi problema era el personaje de Bom.

Para fijar que utilicé Notepad ++, Codificar -> Codificar en UTF-8 sin BOM

Cuestiones relacionadas