Подтвердить что ты не робот

Кросс-доменные запросы с использованием PhoneGap и jQuery не работают

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

  • Тип вызова должен быть 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 дня, но до сих пор никакого результата. Можно ли это сделать? У вас есть какие-то советы для меня, чтобы я мог двигаться дальше?

Спасибо заранее!

4b9b3361

Ответ 1

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

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

to

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

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

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

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

Ответ 2

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

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

Ответ 3

Добавление этого файла в файл config.xml, сохраненный мной

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

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

Ответ 4

Настройка JQuery: $. support.cors = true;

Ответ 5

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

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