Estoy usando jQuery Versión 1.5.1 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 la devolución de llamada exitosa nunca se llama, en su lugar, la devolución de llamada de error produce este resultado:
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 tipo de datos 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 devolución de llamada, porque funciona inyectando una etiqueta de secuencia de comandos en el documento como mecanismo para cargar datos de otro dominio.
Esencialmente, lo que sucede es que una etiqueta de secuencia de comandos se inserta dinámicamente en el documento de la siguiente manera:
<script src="http://the.other.server.com/foo?callback=someFn"></script>
la callback
de llamada depende del recurso al que está llamando, sin embargo, es común que el parámetro sea callback
de llamada.
someFn
luego se usa para procesar los datos devueltos por el servidor, por lo que el servidor debería 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 adecuada.
Todo esto es asumiendo que está tomando el contenido de otro dominio. Si es así, está 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 hacer una llamada entre dominios, tuve el mismo problema. Eventualmente encontré que $.getJSON funcionó. Específicamente,
$.getJSON(url, function(data){ yourFunction(data); return false; });
La URL que usé fue así:
var url = WEB_SERVER_URL; url = url + "&a=" + lat; url = url + "&b=" + lng; .... url = url + "&jsoncallback=?";
En el servidor, que se está ejecutando 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 está utilizando jsonp como tipo de datos (haciendo una solicitud de dominio cruzado) Jquery genera una función aleatoria y se agrega a la URL solicitada como una cadena de consulta llamada devolución de llamada (¿devolución de llamada =?), Debe agregar datos json de respuesta 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 tener este aspecto:
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));
Lea más sobre: error de análisis después de la solicitud jquery.ajax con tipo de contenido jsonp