2012-04-16 20 views
19

Tworzę aplikację PhoneGap na Androida. Aby uzyskać dane z (zdalnego) serwera, wykonuję wywołanie REST, używając funkcji $ .ajax() jQuery. Jest kilka rzeczy, które trzeba wiedzieć:Żądania między domenami za pomocą PhoneGap i jQuery nie działają

  • Rodzaj połączenia muszą być POST
  • Serwer oczekuje danych JSON (przynajmniej nazwa użytkownika i hasło)
  • serwer odsyła dane JSON

Kod:

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

Ale to nie działa. Kiedy używam Firebuga, aby zobaczyć reakcję serwerów, nie ma nic. Dzięki TcpTrace mogę zobaczyć nagłówki żądania. Zamiast oczekiwanej metody POST istnieje metoda OPTIONS z dodanymi dziwnymi nagłówkami.

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 

Wiem, że ma to coś wspólnego z żądaniami międzydomenowymi, ale nie wiem, jak rozwiązać problem. Próbowałem kilka rzeczy, aby go naprawić, ale bez skutku:

Problem ma też coś wspólnego z tą samą zasadą pochodzenia, ale nie dotyczy to protokołu file: // PhoneGap używa do załadowania lokalnego pliku html.

W moim pliku AndroidManifest.xml opcja

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

jest ustawiony.

Próbuję rozwiązać ten problem przez 2 dni, ale bez rezultatu do teraz. Czy to możliwe? Czy masz jakieś wskazówki, abym mógł przejść dalej?

Z góry dziękuję!

Odpowiedz

8

Rozwiązałem problem sam. Problem znajduje się w adresie URL, w którym muszę dodać domenę.Zmieniłem

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

do

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

i to działa!

Zakładam, że pierwszy adres URL powinien działać, ponieważ działa on w aplikacji na iPhone'a z dokładnie tym samym adresem URL i ustawieniami. Ma też coś wspólnego z podwójną zaporą (firewall Windows i ESET), w której zamykam zaporę systemu Windows.

W każdym razie, dziękuję za odpowiedzi!

+0

Twój problem może zostać naprawiony, ale to nie jest odpowiedź na pytanie, co rozwiązało problem z żądaniem między domenami. – Asqan

0

Spróbuj ustawić dataType:jsonp i ustawić crossDomain:true Dla żądań ajaxowych między domenami możesz użyć jsonp. http://api.jquery.com/jQuery.ajax/

Lub możesz dodać callback =? do twojego adresu URL.

+0

Próbowałem już tego, co sugerujesz, ale to nie działa. Wciąż ten sam problem. Dzięki za odpowiedź. – weerd2

+2

JSONP nie zastępuje międzydomenowej domeny POST – contactmatt

10

Musisz dodać do białej listy swoje zewnętrzne domeny. po prostu przejdź do pliku phonegap/cordova plist w xcode i dodaj nowy wpis, niech jego wartość będzie * i będziesz mógł uzyskać dostęp do dowolnej witryny.

również wiem, że NIE BĘDZIE DZIAŁAĆ W PRZEGLĄDARCE. Przeglądarki mają problemy z dostępem do wielu domen, a nie z kartami telefonicznymi lub urządzeniami mobilnymi.

+1

Właściwie ... może działać w Safari, jeśli ładujesz przez 'file: //', ale Chrome i FF nie są gotowe ... – Devgeeks

+7

możesz go uruchomić w chrome przez wyłączenie zabezpieczeń internetowych. w Windowsie uruchom> 'chrome --disable-web-security' W Mac OS' 'sudo/Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --disable-web-security --ableable geolocation ' – Peter

+0

Dzięki za reakcje facetów, ale nadal nie działa. Nadal otrzymuję errorfunkcja działająca po zakończeniu żądania. Myślę, że ma to coś wspólnego z ustawieniami serwera. Przyjrzę się teraz i będę na bieżąco! – weerd2

3

Dodając to do config.xml zaoszczędziło mi

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

byłem zaskoczony, dlaczego każdy zasób zewnątrz nie ładować, nawet google mapy i moje narzędzie zdalnego debugowania. To mnie uratowało!

+0

To było naprawdę pomocne! – Schiavini

Powiązane problemy