2011-03-17 56 views
8

Afortunadamente ese título no es demasiado críptico. Lo que sucede es que tengo un script jQuery AJAX que estoy tratando de usar para acceder a una API en un servidor remoto, que devuelve una respuesta JSON. Sin embargo, la API devuelve el JSON como tipo MIME "text/html" (en el encabezado de respuesta) en lugar de "application/json". Parece obvio que simplemente necesito cambiar el tipo de contenido devuelto de texto a JSON, para hacer que la llamada AJAX interprete los datos correctamente.jQuery AJAX JSON dataType Conversión

Lamentablemente, este no es el caso. Lo he intentado de muchas maneras diferentes, todas las cuales fallan. Lo más cerca que he estado de hacer que funcione esta llamada API es cuando el depurador me dice "Recurso interpretado como Script, pero transferido con texto tipo MIME/html". Y la AJAX llama a errores con mi mensaje de depuración que vuelca el objeto jqXHR en formato JSON, que me dice: {"readyState":4,"status":200,"statusText":"parsererror"}

Aquí hay un ejemplo de mi código (aunque he cambiado el código de varias maneras, en mis intentos de conseguir que funcione, pero esta versión parece ser el más cercano a corregir):

$.ajax({ 
    type: 'GET', 
    url: 'http://username:[email protected]/api/v1/projects.json', 
    contentType: 'application/json', 
    dataType: 'jsonp', 
    converters: { 
     'jsonp': jQuery.parseJSON, 
    }, 
    success: function(data) { 
     alert(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(JSON.stringify(jqXHR)); 
     console.log(textStatus+': '+errorThrown); 
    } 
}); 

Si alguien puede averiguar lo que tengo que hacer de manera diferente para hacer este trabajo, voy a estar muy agradecido.

También puede valer la pena señalar que si usted copiar/pegar el URL de la API en una barra de direcciones del navegador y pulse ir, da la respuesta JSON apropiado con la cabecera de la respuesta correcta ("application/json")

+0

¿Ha intentado simplemente establecer 'dataType:" html "', y luego analizarlo con éxito? –

+0

Absolutamente. Si hago eso, obtengo un error de origen. Esta es una solicitud entre dominios, no lo olvides, por lo que 'dataType' tiene que ser' jsonp' o 'json' con' callback =? 'En la URL que hace que jQuery lo convierta automáticamente en' jsonp' . También intenté agregar 'callback =?' While dataType = 'html', pero todavía no tuve suerte. – therealklanni

+0

¿Puedes publicar la respuesta que está enviando tu servidor? –

Respuesta

1

De modo que a menos que Kanbanpad actualice su API, no se puede acceder directamente con JS. Deberá usar PHP (u otro) para manejar las solicitudes.

Funciona igual de bien, solo requiere un paso adicional.

Simplemente para cualquiera que esté buscando una solución.

+0

Este problema está relacionado con la biblioteca 'JSON' y no con kanbanpad. –

+0

Falso. El problema ** ES ** que Kanbanpad esté usando JSON, que no tiene dominio cruzado. Esta es la razón por la cual las solicitudes de proxy a través de PHP son necesarias. Deberían estar usando JSONP o alguna otra API de estilo CORS que facilite XHR entre dominios. – therealklanni

0
dataFilter(data, type)Function 
    A function to be used to handle the raw response data of XMLHttpRequest. 
This is a pre-filtering 
function to sanitize the response. You should return the sanitized data. The function 
accepts two arguments: The raw data returned from the server and the 'dataType' parameter. 

Cambiaría el tipo de contenido en el interceptor de dataFilter a json. Tenga en cuenta que esto afecta todas las llamadas ajax, por lo tanto, utilice la información de datos para decidir cuáles desea convertir.

+0

Intenté agregar \t 'dataFilter: function (data, type) {return JSON.stringify (data); }, 'en la llamada AJAX, pero sigo recibiendo el mismo error de tipo MIME. – therealklanni

-1

trate de cambiar su tipo de contenido a este

   contentType: "application/json; charset=utf-8", 
+0

Eso no hace la diferencia. Ni siquiera estoy seguro de por qué piensas que eso ayudaría. – therealklanni

0

Compruebe que el servidor envía una respuesta jsonp. Esto significa que json debe incluirse con una cadena de devolución de llamada.

El nombre de devolución de llamada se pasa en los parámetros, y si no está configurando de forma explícita, se ve algo como: jQuery15102810791094068532_1300988427891 (Según http://www.json-p.org/)

En su servidor, es necesario formatear la respuesta:

jQuery15102810791094068532_1300988427891({...json response ...}); 

Donde utiliza la devolución de llamada definida en su parámetro GET 'callback'.

Puede intentar configurar el tipo a "json" y ver si funciona. He tenido varios parsererror con jsonp de jquery; puedes probar http://code.google.com/p/jquery-jsonp hasta que sea un poco más suave.

+0

Gracias por la respuesta enlatada. Por favor, lea la pregunta antes de responder. – therealklanni

+0

@theRealKlanni - No fue una respuesta enlatada: tiene su dataType configurado en 'jsonp' no 'json'. Si está recibiendo solo json, su servidor no está enviando jsonp ... lo que causará el error que está recibiendo. El texto que debe recuperar debe verse así: "mycallbackfunction ({" parameter1 ": 0," parameter2 ":" 1 "})" ... si devuelve texto como "{" parameter1 ": 0," parameter2 ": "1"} "- entonces su servidor necesita agregar la función de retorno de llamada a su respuesta. –

+0

¿Se puede modificar la respuesta desde el final del servidor? –

Cuestiones relacionadas