2010-08-28 7 views
2

Je suis actuellement en train de jouer avec les API de Google en utilisant ajax bibliothèque jquery creux. Pour utiliser une API google service, je dois obtenir un jeton d'authentification envoyant une requête à ClientLogin. En fait, je ne sais pas comment passer le jeton à la deuxième requête.Définir la réponse ajax comme variable globale

J'ai mis un jeton variable globale comme var token = null;

J'appelle deux demandes sur $(document).ready event.

  1. Le premier est un https POST demande à Google ClientLogin dans afin d'obtenir jeton d'identification d'utilisateur.

est ici le code de la première demande de paiement ajax:

$.ajax({ 
    type: "POST", 
    url: "https://" + host + clientLoginEntryPoint, 
    data: cLRequestData(accountType, user, pwd, service), 
    dataType: "html", 
    success: function (response) {  
     var tokenArray = response.split("="); // Split to response tokenArray[3] is the auth token 
     token = tokenArray[3]; 
     $(".status").html(token); 
    } 
}); // END OF CLIENT LOGIN REQUEST 
  1. Le second est censé appeler l'API de contacts avec un http GET.

    $.ajax({ 
    type: "GET", 
    url: "http://" + host + googleContactEntryPoint, 
    beforeSend: function(xhr) { 
        xhr.setRequestHeader('Authorization', 'GoogleLogin auth=' + token); 
        xhr.setRequestHeader('GData-Version', '3.0'); 
    }, 
    success: function(response, textStatus, xhr) { 
        var names = $(response).find('entry>title').text(); 
        $(".status").text(names); 
    }, 
    error: function(xhr, status, error) { 
        $(".status").html(xhr.status+ " "+ xhr.statusText); 
    } 
    

    }); // FIN DE GOOGLE CONTACT DEMANDE

Le problème que je suis face est que jeton est réglé sur null lorsque je tente de définir Google dans la tête Authentification deuxième demande. J'ai déjà lu link text mais cela ne fonctionne pas pour moi. Je dois maintenant faire quelque chose avec callback/événements mais je n'arrive pas à comprendre comment faire.

Toute aide appréciée

Répondre

3

Question a été mis à jour:

Vous redéclarant une variable locale dans votre première demande du nom token, donc il n'utilise pas le token global que vous avez lancé avec null.

Supprimer le mot-clé var dans la première demande.

token = tokenArray[3]; 

Si les requêtes exécutées de façon séquentielle, le second ne sera pas attendre le premier à recevoir sa réponse avant son exécution.

Si c'est le cas, placez la deuxième requête dans un function et appelez cette fonction depuis le rappel success: dans le premier.

$.ajax({ 
    type: "POST", 
    url: "https://" + host + clientLoginEntryPoint, 
    data: cLRequestData(accountType, user, pwd, service), 
    dataType: "html", 
    success: function (response) {  
     var tokenArray = response.split("="); // Split to response tokenArray[3] is the auth token 
     token = tokenArray[3]; 
     $(".status").html(token); 
     // Call second request here 
     secondRequest(token); // optionally pass the "token" 
           // instead of using global var 
    } 
}); // END OF CLIENT LOGIN REQUEST 


function secondRequest(token) { 
    $.ajax({ 
    type: "GET", 
    url: "http://" + host + googleContactEntryPoint, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('Authorization', 'GoogleLogin auth=' + token); 
     xhr.setRequestHeader('GData-Version', '3.0'); 
    }, 
    success: function(response, textStatus, xhr) { 
     var names = $(response).find('entry>title').text(); 
     $(".status").text(names); 
    }, 
    error: function(xhr, status, error) { 
     $(".status").html(xhr.status+ " "+ xhr.statusText); 
    } 
    }) 
} 

(Dans ce code, vous pouvez réellement se débarrasser de la variable token globale, et il suffit de passer la token de la première demande à la seconde en tant que paramètre de la fonction.)

+0

Merci beaucoup Patrick pour votre réponse. J'ai mis à jour le code mais mon script s'est cassé quand j'ai appelé la deuxième demande. Il casse lorsque je définis l'en-tête Autorisation sur la valeur de jeton. J'ai l'erreur de console suivante: Erreur: exception non interceptée: [Exception ... "Composant a renvoyé le code d'échec: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" emplacement: "image JS: : GContactsAPI.js :: anonymous :: ligne 45 "data: non] Des idées? – anchnk

+0

@anchnk - Avez-vous vérifié que 'token' semble correct à l'intérieur de' secondRequest() '? Je ne sais rien de la réponse que vous obtenez de la première demande, ou comment configurer correctement votre deuxième. Je ferais 'console.log (token)' dans la fonction 'secondRequest()' pour m'assurer qu'il a la valeur que vous attendez. – user113716

+0

Oui, j'ai la même valeur que dans la réponse complète. Je vais essayer de redémarrer le navigateur et voir. Un autre point est que je fais cette demande à partir d'un fichier local à partir de maintenant. J'ai donc ajouté netscape.security.PrivilegeManager.enablePrivilege ("UniversalBrowserRead"); être en mesure d'envoyer une demande, mais je ne suis pas sûr que cela ait quelque chose à voir avec ça. – anchnk

0

ressemble à la La portée du jeton de variable n'est pas globale. vous l'avez défini dans le cadre de la fonction de succès pour la demande initiale d'ajax

+0

Désolé, c'était une erreur pendant le copier/coller, j'ai modifié le post pour refléter la version actuelle de la source, il ne fonctionne pas sans le mot-clé var. – anchnk