web-dev-qa-db-fra.com

Les requêtes interdomaines utilisant PhoneGap et jQuery ne fonctionnent pas

Je crée une application PhoneGap pour Android. Pour obtenir des données du serveur (distant), je passe un appel REST à l'aide de la fonction $ .ajax () de jQuery. Il y a quelques choses que vous devez savoir:

  • Le type de l'appel doit être POST
  • Le serveur attend des données JSON (au moins nom d'utilisateur et mot de passe)
  • Le serveur renvoie les données JSON

Le code:

function makeCall(){
    var url = "http://remote/server/rest/call";

    var jsonData ='{"username":"'+$('#username').val()+'","password":"'+$('#password').val()+'"}';

    $.ajax({
            headers: {"Content-Type":"application/json; charset=UTF-8"},
            type: "POST",
            url: url,
            data: jsonData,
            dataType: "json",
            success: succesFunction,
            error: errorFunction
    });
}

Mais ça ne marche pas. Lorsque j'utilise Firebug pour voir la réponse des serveurs, il n'y a rien. Avec TcpTrace, je peux voir les en-têtes de la requête. Au lieu d'une méthode POST attendue, il existe une méthode OPTIONS, avec quelques en-têtes étranges ajoutés.

OPTIONS /remote/server/rest/call HTTP/1.1
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

Je sais que cela a quelque chose à voir avec les requêtes inter-domaines, mais je ne sais pas comment résoudre le problème. J'ai essayé plusieurs choses pour y remédier, mais sans résultat:

Le problème a également quelque chose à voir avec la même politique d'origine, mais cela ne s'applique pas au fichier: // protocole utilisé par PhoneGap pour charger un fichier html local.

Dans mon fichier AndroidManifest.xml, l'option 

<uses-permission Android:name="Android.permission.INTERNET" />

est réglé.

J'essaie de résoudre ce problème depuis 2 jours maintenant, mais aucun résultat jusqu'à présent. Est-ce même possible de faire? Avez-vous des conseils pour que je puisse passer à autre chose?

Merci d'avance!

19
weerd2

J'ai résolu le problème par moi-même. Le problème est situé dans l'URL, où je dois ajouter un domaine. j'ai changé 

var url = "http://remote/server/rest/call"; 

à 

var url = "http://remote.mydomain.com/server/rest/call";

et il fonctionne!

J'ai supposé que la première URL devrait fonctionner car elle fonctionne sur une application iPhone avec exactement les mêmes URL et paramètres. Cela a également quelque chose à voir avec un double pare-feu (pare-feu Windows et ESET) où je ferme le pare-feu Windows.

Quoi qu'il en soit, merci pour vos réponses!

8
weerd2

vous devez ajouter à la liste blanche vos domaines externes. Accédez simplement à votre fichier plist phonegap/cordova dans xcode et ajoutez une nouvelle entrée; sa valeur doit être * et vous pouvez accéder à n’importe quel site Web.

sachez également que cela ne fonctionnera pas dans un navigateur. Les navigateurs ont des problèmes de domaines croisés, pas d’écart téléphonique ou d’appareils mobiles.

10
Drew Dahlman

Ajouter ceci au fichier config.xml m'a sauvé

<gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" version="1.1.1" />
<access Origin="*" />
<allow-navigation href="*" />
<allow-intent href="*" />

Je me demandais pourquoi aucune ressource extérieure ne se chargeait, même Google Maps et mon outil de débogage distant. Cela m'a sauvé!

3
Gokigooooks

Paramètre JQuery: $. Support.cors = true;

1
kingnight

Essayez de définir dataType:jsonp et définissez crossDomain:true Pour les demandes ajax entre domaines, vous pouvez utiliser jsonp. http://api.jquery.com/jQuery.ajax/

Ou vous pouvez ajouter callback =? à votre url.

0
Selvaraj M A