59 votes

Analyseur après requête jQuery.ajax avec type de contenu jsonp

Je suis à l'aide de jQuery Version 1.5.1 de faire ce qui suit appel 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); }
});

Le serveur répond avec un json valide de l'objet:

{
  "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"
       }
     }
   }
 }

Mais le succès de rappel n'est jamais appelée, au lieu de l'erreur de rappel de produit la sortie suivante:

jQuery15109935275333671539_1300495251986 was not called
parsererror

Pourquoi est-ce arrivé?

J'utilise pas de bibliothèques supplémentaires pour jQuery.

EDIT:

Si j'essaie de faire de l'appel ajax avec "json" en tant que type de données au lieu de "jsonp", le serveur répond avec une chaîne vide.

60voto

Evan Trimboli Points 15857

JSONP exige que la réponse soit enveloppé dans une sorte de fonction de rappel.

Donc, le serveur doit répondre avec:

someFn({....});

Le someFn est passée en tant que partie de la demande, de sorte que le serveur doit lire et envelopper les données de manière appropriée.

C'est tout en supposant que vous êtes saisir le contenu d'un autre domaine. Si oui, vous êtes limité par la même origine: http://en.wikipedia.org/wiki/Same_origin_policy

10voto

Bryan Points 156

Après la mise à jour de Jquery 1.5 et de tenter de faire un appel sur les domaines, j'ai eu le même problème. Finalement, j'ai trouvé l' $.getJSON travaillé. Plus précisément,

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

L'URL que j'ai utilisé était comme ceci:

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

Dans le serveur, qui est en cours d'exécution sur un autre serveur et j'ai le contrôle de ce code a été ajouté:

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);
}

(L'objet json est une instance de JSONObject, le code peut être trouvé ici http://www.json.org/java/)

6voto

Rohit Points 335

lorsque vous utilisez jsonp comme type de données (faire des demande de domaine) Jquery générer de l'aléatoire de la fonction et ajouter est à l'url demandée comme une querystring nommé de rappel (callback=?), vous devez ajouter de la réponse json données en paramètre de cette fonction comme indiqué ci-dessous -

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

Les données de réponse devrait ressembler à ceci :

 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));

Lire plus sur : parsererror après jquery.requête ajax avec jsonp type de contenu

enter image description here

3voto

sdepold Points 2901

il y a une petite erreur :) Vous devez demander .js et non .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 et avez-vous remarqué qu'il y a un client pour l'API? https://github.com/dawanda/dawanda-api-client-js

1voto

mattsven Points 9086

Pourquoi n'utilisez-vous pas $ .getJSON pour cela?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X