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 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!
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!
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.
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é!
Paramètre JQuery: $. Support.cors = true;
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.