jquery - domain - jsonp post
Parsererror después de la solicitud jQuery.ajax con el tipo de contenido jsonp (10)
¿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í
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 devolución de llamada correcta, sino que la devolución de llamada 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.
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.
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 "?" (e.g. 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/ )
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){
....
....
}
Intenta leer la respuesta en un objeto usando $ .parseJSON:
success: function(data) {
var json = $.parseJSON(data);
}
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 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:
<script src="http://the.other.server.com/foo?callback=someFn"></script>
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
No todos los servidores admiten jsonp. Requiere que el servidor configure la función de devolución de llamada 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;
});
}
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 "devolución de llamada =" 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 devolución de llamada.
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
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