Jquery succès de fonction pas de tir à l'aide de JSONP

j'ai joué à call my service qui est sur un autre domaine en utilisant jQuery. L'appel au service est fait avec succès (mon point de débogage est déclenché), et la réponse correcte est retournée (je renifle le trafic).

mon problème est principalement que les rappels succès et échecs ne sont pas renvoyés. J'ai lu quelques autres messages sur pour indiquer que l'événement d'erreur n'est pas déclenché lors de L'utilisation de JSONP. Est-ce le cas avec le événement de succès (peut-être parce qu'il est supposé que je fournis ma propre fonction de rappel), ainsi, ou est-il un moyen de tirer mon succès de rappel. Merci à l'avance.

$.ajax({
  type: "GET",
  url: urlOnDiffDomain,
  async: false,
  cache: false,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  error: function(xhr, ajaxOptions, thrownError) {
   alert('failed....');
  }
}); 
28
demandé sur Community 2010-03-04 18:43:27

5 réponses

D'accord. Dans le cas où quelqu'un a besoin de savoir à l'avenir...en rétrospective, la solution aurait probablement dû être plus évidente qu'elle ne l'était, mais vous devez avoir la réponse sur le web écrire directement à la réponse stream . Simplement retourner une chaîne de JSON ne le fait pas, vous avez besoin de quelqu'un le construire et le streamer en arrière. Le code dans mon premier post pourra fonctionner correctement si vous ne le faire en effet.

exemple de code de service:

public void DoWork()
{
  //it will work without this, but just to be safe
  HttpContext.Current.Response.ContentType = "application/json"; 
  string qs = HttpContext.Current.Request.QueryString["callback"];
  HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}

juste pour être explicite, c'est le code côté client.

function localDemo(){
  $.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
    function(data){
      $.each(data, function(i,item){            
        alert(item.x);
      });
  });
}

S'il y a une meilleure façon de le faire, je suis tout ouïe. Pour tout le monde, je sais qu'il existe un certain concept de support natif dans la WCF 4.0 pour JSONP. Aussi, vous pouvez vouloir faire un peu vérification à des fins de sécurité - bien que je n'ai pas beaucoup enquêté.

19
répondu Sanjay Uttam 2010-03-04 22:56:20

la méthode de rappel success est appelée lorsque le serveur répond. La méthode $.ajax définit une fonction qui gère la réponse en appelant la méthode de rappel success .

la raison la plus probable pour laquelle la méthode success n'est pas appelée, est que la réponse du serveur n'est pas correcte. La méthode $.ajax envoie une valeur dans la chaîne de requête callback que le serveur doit utiliser comme nom de fonction dans la réponse JSONP. Si l' serveur utilise un nom différent, la fonction que la méthode $.ajax a mis en place n'est jamais appelée.

si le serveur ne peut pas utiliser la valeur de la chaîne de requête callback pour définir le nom de la fonction dans la réponse, vous pouvez spécifier le nom de la fonction que la méthode $.ajax devrait attendre du serveur. Ajoutez la propriété jsonpCallback à l'objet option, et définissez la valeur au nom de la fonction que le serveur utilise dans la réponse.

si par exemple la méthode $.ajax envoie une requête au serveur en utilisant L'URL http://service.mydomain.com/getdata?callback=jsonp12345 , le serveur doit répondre avec quelque chose ressemblant à:

jsonp12345({...});

si le serveur ignore la chaîne de requête callback , et répond à la place avec quelque chose comme:

mycallback({...});

alors vous devrez Outrepasser le nom de la fonction en ajoutant une propriété à l'objet options:

$.ajax({
  url: urlOnDiffDomain,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  jsonpCallback: 'mycallback'
});
13
répondu Guffa 2010-03-04 16:16:43

Essayer

$.getJSON(urlOnDiffDomain, function(data, textStatus){
    alert('success...');
});

fonctionne pour moi, usally. Vous devez ajouter &callback=? à urlOnDiffDomain, où jQuery remplace automatiquement le callback utilisé dans JSONP.

le rappel d'erreur n'est pas déclenché, mais vous pouvez utiliser le $global.ajaxError, comme ceci

$('.somenode').ajaxError(function(e, xhr, settings, exception) {
    alert('failed');
});
0
répondu 2010-03-04 16:03:49

ce n'est pas une réponse complète à votre question, mais je pense que quelqu'un qui passe aimerait le savoir:

quand vous traitez avec JSONP de WCF reste essayer d'utiliser:

[JavascriptCallbackBehavior(UrlParameterName = "$callback")]

pour la mise en œuvre de votre service; cela devrait vous donner JSONP out-of-the-box.

0
répondu Learner 2012-07-30 10:15:03
    $.ajax({
                url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>',
                dataType: "json",
                data: {
                    featureClass: "P",
                    style: "full",
                    maxRows: 12,
                    artist: request.term
                },
                success: function( data ) {
                    response( $.map( data, function( item ) {
                        return {
                            label: item.artist,
                            value: item.artist,
                            id: item.id
                        }
                    }));
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    alert(thrownError);
                  }
            });
0
répondu Darkhan 2012-09-27 17:10:29