Как реализовать междоменный запрос Ajax с использованием CakePHP и jQuery? - PullRequest
3 голосов
/ 19 марта 2009

Я использую CakePHP для своего проекта и генерирую представления XML, чтобы я мог взаимодействовать с ними (CRUD) с внешнего веб-сайта. На веб-сайте CakePHP требуется аутентификация.

По сути, я хочу просмотреть "http://mycakeapp.com/posts/views/1.xml" из" http://www.example.com"

Тем не менее, я получаю эту ошибку при использовании ajax-функции jQuery: Доступ к ограниченному URI запрещен "код:" 1012 . Из поиска в Google кажется, что, возможно, попробовать JSONP - вариант ... но он не является родным для тортов, и поэтому я бы предпочел использовать xml: (

Я пытался использовать iframe: он загружает экран входа в систему - и после того, как я вхожу, он загружает текущую страницу (например, «http://www.example.com")! Даже если источником iframe является« http://mycakeapp.com/posts/views/1.xml"

Кто-нибудь занимался этой проблемой раньше?

Обновление: Чтобы быть более конкретным, я хотел бы создать букмарклет, который будет взаимодействовать с моим веб-сайтом (построенный на CakePHP), поэтому метод URL-прокси не будет работать (но спасибо за предложение)

Ответы [ 3 ]

4 голосов
/ 19 марта 2009

Просто создайте прокси-скрипт на PHP. пусть Ajax запросит ваш прокси-скрипт, ваш прокси-скрипт «перенаправит» ваш запрос через домен с помощью cURL, просто попросите ваш прокси-скрипт вывести ответ, полученный от вашего запроса cURL, и вам будет хорошо.

3 голосов
/ 19 марта 2009

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

Вот скрипт, который я использую для вызова другого домена и передачи ему параметра proxy_url в кодировке urlencoded.

url_proxy.php

// Is it a POST or a GET?
$url = ($_POST['proxy_url']) ? $_POST['proxy_url'] : $_GET['proxy_url'];

// Open the Curl session
$session = curl_init($url);

// If it's a POST, put the POST data in the body
if ($_POST['proxy_url']) {
    $postvars = '';
    while ($element = current($_POST)) {
        if (key($_POST) != 'proxy_url') {
            $postvars .= key($_POST).'='.$element.'&';
        }
        next($_POST);
    }
    curl_setopt ($session, CURLOPT_POST, true);
    curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
}

// Don't return HTTP headers. Do return the contents of the call
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

// Make the call
$response = curl_exec($session);

// Return the response
if (curl_errno($session)) {
    $error_message = curl_error($session);
    echo 'Error: '.$error_message;
} else {
    echo $response;
}

curl_close($session);
?>

В вашем случае вы можете изменить бит обработки ошибок, чтобы он возвращал действительный бит xml, который может анализировать ваше приложение.

Я обычно кладу это в свой webroot и вызываю из javascript примерно так:

function showMapLegend(baseURL, layer) {
    var url = 'http://our-map-server/get-a-legend.php?layer='+layer;
    var dt = new Date();
    var proxy = baseURL + '/url_proxy.php?currDate='+dt.getTime()+'&proxy_url=';
    url = proxy + encodeURIComponent(url);

    new Ajax.Request(url, {
        method: 'get',
        onSuccess: function(transport) {
            $('map-legend-img').src = transport.responseText;
            new Effect.Appear('map-legend', {duration: 0.5});
        }
    });
}

Пример функции javascript, приведенной выше, используется для получения простой строки URL-адреса с нашего картографического сервера, нам все равно, если она не сработает, поэтому нет onFailure и т. Д., В основном это Prototype, но я уверен, что вы поняли о том, как это использует прокси-скрипт.

Передается переменная baseURL, она должна содержать base "http://server/theappname", как URL для вашего приложения.

0 голосов
/ 25 марта 2009

JSONP определенно то, что вы ищете.

Может быть, вам поможет следующая страница: http://www.ibm.com/developerworks/xml/library/x-xml2jsonphp/

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