Междоменная проблема с доменом .ajax (JQuery) в принадлежащем мне домене - простая страница PHP - PullRequest
3 голосов
/ 08 января 2012

Итак, я знаю, что это общая проблема, и многие люди об этом говорили, но чувствуют, что моя ситуация уникальна и, возможно, не так вовлечена, как другие.

У меня есть хост-сайт, и я пытаюсь создать приложение для iPhone с JQ и PhoneGap.

Я хочу, чтобы люди могли передавать свои результаты на мой домашний домен из приложения, но меня это пугает: «Исходное значение NULL не разрешено Access-Control-Allow-Origin». когда я пытаюсь назвать это:

$.ajax({
        type: "POST",
        url: 'http://www.homesite.com/thephppage.php',
        data: {
            'guid': '12333-54',
            'score': 52,
            'initials': 'tod'
        },
        success: function (data) {
            try {

                }
                else {

                }
            }
            catch (err) {
                alert(err);
            }
        },
        error: function (xhr) {
            alert(xhr.responseText);
        }
    });

Поскольку это обращение к домену, которым я владею, могу ли я сделать что-то простое, чтобы исправить эту проблему?

Спасибо. Т * +1010 *

Ответы [ 4 ]

5 голосов
/ 08 января 2012

Тот факт, что вы владеете обоими доменами, не меняет того факта, что запросы ajax не могут быть междоменными.

Поскольку это обращение к домену, которым я владею, могу ли я сделать что-то простое, чтобы исправить эту проблему?

Да

Обратите внимание на настройку CORS , которая позволит вам выполнять эти междоменные запросы. Кроме того, согласно документам jQuery , jQuery должен поддерживать запросы CORS - в основном

xhrFields (добавлено 1.5.1) Карта Карта пар полей fieldName-fieldValue для установки на родном объекте XHR. Например, вы можете использовать его для установки withCredentials в true для междоменных запросов, если необходимо.

$. Ajax ({url: a_cross_domain_url, xhrFields: { withCredentials: true}}); В jQuery 1.5 свойство withCredentials не было распространено на собственный XHR и, таким образом, Запросы CORS, требующие его, будут игнорировать этот флаг. По этой причине мы рекомендуем использовать jQuery 1.5.1+, если вам требуется его использование.


В настоящее время из-за ошибки в Firefox, где .getAllResponseHeaders () возвращает пустую строку, хотя .getResponseHeader ('Content-Type') возвращает непустую строку, автоматически декодируя ответы JSON CORS в Firefox с jQuery не поддерживается.

3 голосов
/ 08 января 2012

вам придется изменить crossDomain на true.

проверить jquery ajax api и параметры http://jqapi.com/#p=jQuery.ajax

2 голосов
/ 08 января 2012

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

Вы можете использовать PHP для пересылки данных, используя, например, HttpRequest::send

(не включая аутентификацию пользователя)):

$url = 'http://mydomain.com/score.php';
$r = new HttpRequest($url, HttpRequest::METH_GET);
$r->addQueryData(array('initials' => $initials, 'score' => $score));

try {
    $json = $r->send()->getBody();
    // output the response to forward it to the app
    echo $json;
} catch (HttpException $ex) {
    // handle error
}
0 голосов
/ 08 января 2012

РАБОЧАЯ !!! О, СЛАВА !!! (вроде): вот что я сделал ...

Вместо того, чтобы использовать .ajax, я пошел по маршруту JSONP (вроде) и динамически добавил тег в мою голову так:

var head = document.getElementsByTagName('head')[0];
  script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'http://thesite.co/thepage.php?var1=123&var2=432&var3='ttt';
  head.appendChild(script);

Мне даже не пришлось давать ему метод CALLBACK, потому что (поскольку я владею целевым сайтом и знаю, как он поступает) на моей стороне PHP, я обертываю возвращаемое значение методом methodName следующим образом:

$ encoded = json_encode ($ json); echo "testMethod (". $ encoded. ")"; Это сработало на удивление, КРОМЕ НА ЧЕРТЫХ симуляторах iPhone и iPad !!! (черт возьми, мне нужно купить реальные устройства ...) Так что я все еще не знаю, работает ли это на реальных устройствах, но теперь работает в Chrome и Safari ... будем надеяться, я смогу выяснить, как заставить его работать на этом телефоне !

СПАСИБО всем за помощь!

========== ВТОРОЕ ЛУЧШЕЕ МОБИЛЬНОЕ РЕШЕНИЕ ====================== Это работает лучше, чем решение JSONP - динамический скрипт. ..

Вставьте этот тег в свою голову под вызовами Phonegap и JQ.

<script type="text/javascript">
        $(document).bind("mobileinit", function () {
           $.mobile.allowCrossDomainPages = true;
        });
    </script>

Затем в файле Phonegap.plist в папке ресурсов XCODE добавьте домен во внешние домены ... т.е. phonegap.com. (Оставьте http или www).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...