web-dev-qa-db-fra.com

La fonction de réussite Jquery ne se déclenche pas à l'aide de JSONP

Je suis en train de jouer en appelant mon service qui se trouve sur un domaine différent en utilisant jQuery. L'appel au service est passé avec succès (mon point de débogage est déclenché) et la réponse correcte est renvoyée (je renifle le trafic). 

Mon problème est principalement que les rappels de succès et d'échec ne sont pas virés. J'ai lu certains autres articles sur SO qui indiquent que l'événement d'erreur n'est pas déclenché lors de l'utilisation de JSONP. Est-ce le cas avec l'événement de réussite (peut-être parce qu'il est supposé que je fournis ma propre fonction de rappel), ou existe-t-il un moyen de déclencher mon rappel de succès? Merci d'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
Sanjay Uttam

Bien. Au cas où quelqu'un aurait besoin de savoir à l'avenir ... Avec le recul, la solution aurait probablement dû être plus évidente qu'elle ne l'était auparavant, mais vous devez faire en sorte que la réponse sur le Web soit écrite directement dans la réponse stream. Renvoyer simplement une chaîne de JSON ne le fait pas, vous devez le faire construire par quelqu'un et le rediffuser. Le code de mon message original fonctionnera correctement si vous le faites effectivement. 

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, il s'agit du 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 un meilleur moyen de faire cela, je suis tout ouïe. Pour tous les autres, je sais qu'il existe un concept de prise en charge native dans WCF 4.0 pour JSONP. Aussi, vous voudrez peut-être faire un peu de { vérification } _ pour des raisons de sécurité - bien que je n’aie pas fait beaucoup d’enquêtes.

19
Sanjay Uttam

La méthode de rappel success est appelée lorsque le serveur répond. La méthode $.ajax configure 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 est incorrecte. 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 le serveur utilise un nom différent, la fonction configurée par la méthode $.ajax 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 doit attendre du serveur. Ajoutez la propriété jsonpCallback à l'objet d'option et définissez la valeur sur le nom de la fonction utilisée par le serveur dans la réponse.

Si, par exemple, la méthode $.ajax envoie une demande au serveur à l'aide de l'URL http://service.mydomain.com/getdata?callback=jsonp12345, le serveur doit répondre avec un résultat ressemblant à ceci:

jsonp12345({...});

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

mycallback({...});

Ensuite, vous devrez remplacer 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
Guffa

Essayer

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

Travaille pour moi, d'habitude. Vous devez ajouter & callback =? à urlOnDiffDomain, où jQuery remplace automatiquement le rappel 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
codecandies
    $.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
Darkhan