2012-04-16 2 views
19

Я создаю приложение PhoneGap для Android. Чтобы получить данные с (удаленного) сервера, я делаю вызов REST с помощью функции $ .ajax() jQuery. Есть несколько вещей, которые вы должны знать:Запросы кросс-домена с использованием PhoneGap и jQuery не работают

  • Тип вызова должен быть POST
  • Сервер ожидает данные в формате JSON (по крайней мере, имя пользователя и пароль)
  • Сервер отправляет обратно данные JSON

код:

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

Но это не работает. Когда я использую Firebug, чтобы увидеть ответ сервера, ничего нет. С TcpTrace я могу видеть заголовки запроса. Вместо ожидаемого метода POST существует метод OPTIONS с добавлением некоторых странных заголовков.

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 

Я знаю, что это как-то связано с выполнением междоменных запросов, но я не знаю, как решить проблему. Я попробовал несколько вещей, чтобы исправить это, но без результата:

Проблема имеет также что-то делать с той же политикой происхождения, но это не относится к файлу: // протокол PhoneGap используется для загрузки локального файла html.

В моем файле AndroidManifest.xml, опция

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

установлен.

Я пытаюсь исправить это в течение 2 дней, но до сих пор нет результата. Можно ли это сделать? У вас есть какие-то советы для меня, чтобы я мог двигаться дальше?

Заранее благодарен!

ответ

8

Я решил проблему самостоятельно. Проблема находится в URL-адресе, где я должен добавить домен.Я изменил

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

в

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

и это работает!

Предполагалось, что первый URL-адрес должен работать, потому что он работает в приложении iphone с точным одинаковым URL-адресом и настройками. Это также имеет отношение к двойному брандмауэру (брандмауэр Windows и ESET), где я отключил брандмауэр Windows.

В любом случае, спасибо за ответы!

+0

ваша проблема может быть исправлена, но это не тот ответ, который решает проблему междоменного запроса. – Asqan

0

Попробуйте установить dataType:jsonp и установить crossDomain:true Для запросов ajax для перекрестных доменов вы можете использовать jsonp. http://api.jquery.com/jQuery.ajax/

Или вы можете добавить обратный вызов =? на ваш URL.

+0

Я уже пробовал то, что вы предлагаете, но это не работает. Все та же проблема. Спасибо за Ваш ответ. – weerd2

+2

JSONP не заменяет кросс-домен POST – contactmatt

10

Вам нужно сделать белый список внешних доменов. просто перейдите в свой файл phonegap/cordova plist в xcode и добавьте новую запись, пусть это значение будет *, и вы можете получить доступ к любому веб-сайту.

также знают, что это НЕ РАБОТАЕТ В БРАУЗЕРЕ. У браузеров есть проблемы с перекрестными доменами, а не телефонные или мобильные устройства.

+1

Фактически ... он может работать в Safari, если вы загружаете через 'file: //', но Chrome и FF не идут ... – Devgeeks

+7

вы можете заставить его работать в хром, отключив веб-безопасность. в Windows Run> 'chrome --disable-web-security' В Mac OS'> sudo/Приложения/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --disable-web-security --enable-geolocation ' – Peter

+0

Спасибо за ваши ребята, но он все равно не работает. Все еще выполняйте функцию ошибки, когда запрос завершен. Я думаю, что это имеет какое-то отношение к серверам. Я посмотрю на это сейчас и буду держать вас в курсе событий! – weerd2

3

Добавление этого в config.xml спас меня

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

Я был сбит с толку, почему любой внешний ресурс не сработал, даже Google карты и мой удаленный инструмент отладки. Это спасло меня!

+0

Это было действительно полезно! – Schiavini

Смежные вопросы