Parsererror después de la solicitud jQuery.ajax con el tipo de contenido jsonp

Estoy usando la versión 1.5.1 de jQuery para hacer la siguiente llamada ajax:

$.ajax({ dataType: 'jsonp', data: { api_key : apiKey }, url: "http://de.dawanda.com/api/v1/" + resource + ".json", success: function(data) { console.log(data); }, error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); } }); 

El servidor responde con un objeto json válido:

 { "response": { "type":"category", "entries":1, "params":{ "format":"json", "api_key":"c9f11509529b219766a3d301d9c988ae9f6f67fb", "id":"406", "callback":"jQuery15109935275333671539_1300495251986", "_":"1300495252693" }, "pages":1, "result":{ "category":{ "product_count":0, "id":406, "restful_path":"/categories/406", "parent_id":null, "name":"Oberteile" } } } } 

Pero nunca se invoca la callback correcta, sino que la callback de error produce esta salida:

 jQuery15109935275333671539_1300495251986 was not called parsererror 

¿Por qué pasó esto?

No estoy usando bibliotecas adicionales para jQuery.

EDITAR:

Si trato de hacer la llamada ajax con “json” como dataType en lugar de “jsonp”, el servidor responde con una cadena vacía.

JSONP requiere que la respuesta esté envuelta en algún tipo de función de callback, porque funciona inyectando una etiqueta de script en el documento como un mecanismo para cargar datos desde otro dominio.

Esencialmente, lo que sucede es que una etiqueta de script se inserta dinámicamente en el documento de esta forma:

  

callback depende del recurso que está llamando, sin embargo, es común que el parámetro sea de callback .

someFn se usa someFn para procesar los datos devueltos del servidor, por lo que el servidor debe responder con:

 someFn({theData: 'here'}); 

El someFn se pasa como parte de la solicitud, por lo que el servidor debe leerlo y ajustar los datos de manera apropiada.

Todo esto supone que estás tomando el contenido de otro dominio. Si es así, estás limitado por la misma política de origen: http://en.wikipedia.org/wiki/Same_origin_policy

Después de actualizar a Jquery 1.5 e intentar realizar una llamada entre dominios tuve el mismo problema. Eventualmente encontré $ .getJSON trabajado. Específicamente,

 $.getJSON(url, function(data){ yourFunction(data); return false; }); 

La URL que utilicé fue así:

 var url = WEB_SERVER_URL; url = url + "&a=" + lat; url = url + "&b=" + lng; .... url = url + "&jsoncallback=?"; 

En el servidor, que se ejecuta en otro servidor y tengo el control de este código, se agregó:

 PrintWriter writer = response.getWriter(); String jsonString = json.toString(JSON_SPACING); String callback = request.getParameter("jsoncallback"); // if callback in URL and is not just the "?" (eg from localhost) if (callback != null && callback.length() > 1) { writer.write(callback + "(" + jsonString + ");"); } else { writer.write(jsonString); } 

(El objeto json es una instancia de JSONObject, el código se puede encontrar aquí http://www.json.org/java/ )

cuando se usa jsonp como tipo de datos (haciendo solicitud de dominio cruzado) Jquery genera función aleatoria y se agrega a url solicitada como una querystring llamada callback (callback =?), necesita anexar datos de respuesta json como un parámetro de esta función como se indica a continuación –

 url : http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request url call by ajax : http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request&callback=jQuery1510993527567155793_137593181353 

Los datos de respuesta deberían verse así:

  string callback = context.Request.QueryString["callback"]; if (!string.IsNullOrEmpty(callback)) context.Response.Write(string.Format("{0}({1});", callback, jc.Serialize(outputData))); else context.Response.Write(jc.Serialize(outputData)); 

Obtenga más información sobre: parsererror after jquery.ajax request with jsonp content type

enter image description here

hay un pequeño error 🙂 Tienes que pedir .js y no .json.

 $.ajax({ dataType: 'jsonp', data: { api_key : apiKey }, url: "http://de.dawanda.com/api/v1/" + resource + ".js", success: function(data) { console.log(data); }, error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); } }); 

Ah, ¿y te diste cuenta de que hay un cliente para la api? https://github.com/dawanda/dawanda-api-client-js

Realmente no deberías especificar jsonp aquí. Solo usa json porque solo estás recibiendo una cadena JSON. json (json con relleno) espera que se ejecute una función javascript. En ese caso, debe especificar una “callback =” dentro de su cadena de consulta. Supongo que es la razón por la cual jQuery no puede manejar esto también, hay una propiedad con el nombre de callback.

Intenta leer la respuesta en un objeto usando $ .parseJSON:

 success: function(data) { var json = $.parseJSON(data); } 

Asegúrese de que el servicio al que llama tenga la capacidad de devolver datos en formato JsonP.

Si está utilizando asp.net webapi, puede usar WebApiContrib.Formatting.Jsonp, es de código abierto.

Asegúrese de tener una línea como la siguiente en WebApiConfig.Register.

config.Formatters.Insert (0, new JsonpMediaTypeFormatter (new JsonMediaTypeFormatter (), “callback”));

Estaba tirando de mi cabello sobre esto. Espero que esto ayude a alguien.

No todos los servidores admiten jsonp. Requiere que el servidor configure la función de callback en sus resultados. Lo uso para obtener respuestas json de sitios que devuelven json puro pero que no son compatibles con jsonp (pero podría hacerlo en el futuro):

 function AjaxFeed(){ return $.ajax({ url: 'http://somesite.com/somejsonfile.php', data: {something: true}, dataType: 'jsonp', /* Very important */ contentType: 'application/json', }); } function GetData() AjaxFeed() /* Everything worked okay. Hooray */ .done(function(data){ return data; }) /* Okay jQuery is stupid manually fix things */ .fail(function(jqXHR) { /* Build HTML and update */ var data = jQuery.parseJSON(jqXHR.responseText); return data; }); } 

¿El mismo problema que estaba obteniendo hasta que no haya agregado el parámetro “callback =?” o “c =?” en url.

Me gusta: ” http://de.dawanda.com/api/v1/ ” + resource + “.json & c =?”

Puede resolver su problema. Funcionó para mí

Gracias a Evan Trimboli.

Solo se agregaron los cambios que he hecho

json-callback = someFun

y cambió el nombre de la función anónima de

función (dl)

a

Funcionalidad Fun (dl)

la línea completa de código es la siguiente:

 getJSON("http://localhost/phk/districtList.json?json-callback=someFun", function someFun(dl){ .... .... }