it-swarm.com.de

Domainübergreifende Anforderungen mit PhoneGap und jQuery funktionieren nicht

Ich erstelle eine PhoneGap-App für Android. Um Daten vom (Remote-) Server zu erhalten, mache ich einen REST - Aufruf mit der $ .ajax () - Funktion von jQuery. Es gibt einige Dinge, die Sie wissen müssen:

  • Die Art des Anrufs muss POST sein
  • Der Server erwartet JSON-Daten (mindestens Benutzername und Kennwort).
  • Der Server sendet JSON-Daten zurück

Der 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
    });
}

Das funktioniert aber nicht. Wenn ich Firebug verwende, um die Antwort des Servers zu sehen, gibt es nichts. Mit TcpTrace kann ich die Header der Anfrage sehen. Anstelle einer erwarteten POST - Methode gibt es eine OPTIONS-Methode mit einigen seltsamen Headern.

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

Ich weiß, es hat etwas mit domänenübergreifenden Anfragen zu tun, aber ich weiß nicht, wie ich das Problem lösen kann. Ich habe ein paar Dinge versucht, um das Problem zu beheben, aber ohne Ergebnis:

Das Problem hat auch etwas mit derselben Origin-Richtlinie zu tun. Dies gilt jedoch nicht für das Protokoll file: //, das PhoneGap zum Laden einer lokalen HTML-Datei verwendet.

In meiner AndroidManifest.xml-Datei die Option 

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

eingestellt ist.

Ich versuche das jetzt für 2 Tage zu korrigieren, aber bis jetzt kein Ergebnis. Ist das überhaupt möglich? Hast du irgendwelche Tipps für mich, damit ich weitermachen kann?

Danke im Voraus!

19
weerd2

Ich habe das Problem alleine gelöst. Das Problem befindet sich in der URL, wo ich eine Domäne hinzufügen muss. ich habe mich verändert 

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

zu 

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

und es funktioniert!

Ich ging davon aus, dass die erste URL funktionieren sollte, da sie auf einer iPhone-App mit genau derselben URL und denselben Einstellungen funktioniert. Es hat auch etwas mit einer doppelten Firewall (Windows- und ESET-Firewall) zu tun, bei der ich die Windows-Firewall heruntergefahren habe.

Trotzdem danke für deine Antworten!

8
weerd2

sie müssen Ihre externen Domains auf die Whitelist setzen. Gehen Sie einfach zu Ihrer phonegap/cordova plist-Datei in xcode und fügen Sie einen neuen Eintrag hinzu. Der Wert ist *, und Sie können auf jede Website zugreifen.

wissen auch, dass dies nicht in einem Browser funktioniert. Browser haben Crossdomain-Probleme, keine Telefonkarten oder Mobilgeräte.

10
Drew Dahlman

Das Hinzufügen zur config.xml hat mich gerettet

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

Ich war verblüfft, warum keine externen Ressourcen geladen wurden, sogar Google Maps und mein Remote-Debugging-Tool. Das hat mich gerettet!

3
Gokigooooks

JQuery-Einstellung: $. Support.cors = true;

1
kingnight

Versuchen Sie, dataType:jsonp einzustellen und crossDomain:true.__ einzustellen. Für domänenübergreifende Ajax-Anforderungen können Sie jsonp verwenden. http://api.jquery.com/jQuery.ajax/

Oder du kannst callback = anhängen? auf Ihre URL.

0
Selvaraj M A