it-swarm.com.de

Phonegap Cross-Domain AJAX POST Anfrage funktioniert nicht auf Android

Die domänenübergreifende AJAX POST - Anforderung funktioniert einwandfrei in Webbrowsern, einschließlich Browsern auf Mobiltelefonen, jedoch nicht für native Anwendungen, die mit Phonegap erstellt wurden.

Ich habe ein Anmeldeformular erstellt, in das Benutzer ihre Anmeldeinformationen eingeben müssen. Dann werden sie von dem Server überprüft, der auf heroku gehostet wird, und geben json {"success":true} zurück, wenn gültige Anmeldeinformationen eingegeben werden.

Mein Ajax-Skript:

$.ajax({
   type: "POST",
   url: "http://domain.com/public/auth/app-login",
   contentType: "application/x-www-form-urlencoded; charset=utf-8",
   dataType: "json",
   data: {identity: <username from form>, password: <password from form>},
   crossDomain: true,
   cache: false,
   success: function(data) {
       obj = JSON.parse(data);
       if (obj && obj.success === true) {
          window.location.href = 'home.html';
       }
   },
   error: function(e) {
       alert('Error: ' + e.message);
   }
});

Schritte zur Behebung dieses Problems:

<access Origin="http://domain.com/public/auth/app-login" />

<access Origin="*" />

  • JQuery anweisen, domänenübergreifend zuzulassen

$.support.cors = true; ODER jQuery.support.cors = true;

  • Zwischenspeicherung deaktivieren cache: false

Jede Hilfe wird geschätzt.

11
h4kl0rd

OK. Wenn index.html in local dann kann ajax beliebige Hosts aufrufen, muss CORS nicht in Client oder Server aktiviert werden. Du entfernst:

$.support.cors = true; OR jQuery.support.cors = true;

Und:

<access Origin="http://domain.com/public/auth/app-login" />

Es ist redundant, nur zu verwenden:

<access Origin="*" />

Sie müssen in AndroidManifest.xml prüfen und hinzufügen: 

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

Fügen Sie weitere Berechtigungen hinzu, wenn Ihre App erforderlich ist. Rufen Sie schließlich ajax in $ (document) .ready () auf: 

$.ajax({
   type: "POST",
   url: "http://domain.com/public/auth/app-login",
   dataType: "json",
   data: {identity: <username from form>, password: <password from form>},
   success: function(data) {
     obj = JSON.parse(data);
     if (obj && obj.success === true) {
        window.location.href = 'home.html';
     }
   },
   error: function(e) {
     alert('Error: ' + e.message);
   }
});
7
Hanh Le

Wenn Sie dieses Problem lösen möchten, möchten Sie möglicherweise sicherstellen, dass das Plugin ordnungsgemäß in den Erstellungsprozess einbezogen wird.

RESOURCE: \app\config.xml
<widget>
    .... [lots of stuff] ....
    <gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" />
    <access Origin="http://*" />
    ....
</widget>

Möglicherweise möchten Sie auch eine Version angeben, da dies empfohlen wird. Um zu testen, ob das Plugin enthalten ist, verwenden Sie das kostenlose Cloud-Konto unter https://build.phonegap.com/apps . Wenn Sie Ihr Projekt dort erstellen, können Sie die Registerkarte Plugins überprüfen und sicherstellen, dass das Whitelist-Plugin enthalten ist.

Ich habe gelesen, dass Sie dies nur im Element HEAD Ihrer HTML-Seite benötigen sollten, aber ich habe festgestellt, dass ich zum Zeitpunkt dieses Beitrags noch das Plugin hinzufügen musste.

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

Wenn das Plugin nicht geladen ist, erhalten Sie möglicherweise die Fehlermeldung "Not Found", wenn Sie die $.ajax-Methode für jQuery für die Fehlerzeichenfolge verwenden.

Einige der Informationen im Internet weisen Sie darauf hin, dass die Whitelist-Informationen im Ordner /www/res/ abgelegt werden. Dies scheint jedoch veraltete Informationen zu sein. Vielleicht finden Sie auch, dass <plugin... in einigen Beispielen verwendet wird, aber es scheint, dass dies ein veralteter Weg ist.

Möglicherweise benötigen Sie auch:

RESOURCE: \app\config.xml
<widget>
     ...
     <feature name="http://api.phonegap.com/1.0/network"/>
     ...
</widget>
4
kmcguire

benutzen

JSON.stringify(data: {identity: <username from form>, password: <password from form>}) 

anstelle von data: {identity: <username from form>, password: <password from form>}

Ich habe eine Erfolgsmeldung erhalten, als ich meinen Code so geändert habe.

1