Как реализовать междоменный Ajax-запрос с использованием CakePHP и jQuery?
-
20-08-2019 - |
Вопрос
Я использую CakePHP для своего проекта и создаю XML-представления, чтобы я мог взаимодействовать с ними (CRUD) с внешнего веб-сайта.На веб-сайте CakePHP требуется аутентификация.
По сути, я хочу просмотреть "http://mycakeapp.com/posts/views/1.xml" откуда "http://www.example.com"
Однако я получаю эту ошибку при использовании ajax-функции jQuery: Доступ к ограниченному коду URI запрещен":"1012.Из поиска в Google кажется , что , возможно , попробовать JSONP - это вариант ..но он не является родным для cake, и поэтому я бы предпочел использовать xml : (
Я пробовал использовать iframe:он загружает экран входа в систему - и после того, как я войду в систему, он загружает текущую страницу (например"http://www.example.com")!Даже несмотря на то, что источник iframe является "http://mycakeapp.com/posts/views/1.xml"
Кто-нибудь сталкивался с этой проблемой раньше?
Обновить: Чтобы быть немного более конкретным, я хотел бы создать букмарклет, который взаимодействует с моим сайтом (построенный на CakePHP), поэтому метод прокси URL не будет работать (но спасибо за предложение)
Решение
JSONP - это определенно то, что вы ищете.
Возможно, следующая страница могла бы вам помочь: http://www.ibm.com/developerworks/xml/library/x-xml2jsonphp/
Другие советы
Просто создайте прокси-скрипт на PHP.позвольте Ajax запросить ваш прокси-скрипт, попросите ваш прокси-скрипт "переслать" ваш запрос по домену с помощью cURL, просто попросите ваш прокси-скрипт повторить ответ, который вы получите от вашего запроса cURL, и все будет готово.
Как упоминал mmattax, самый простой способ сделать это - использовать прокси-скрипт.
Вот скрипт, который я использую для вызова другого домена, передавая ему параметр proxy_url с urlencoded proxy_url .
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 обратно с нашего картографического сервера, нам все равно, произойдет ли сбой, поэтому нет сбоя и т.д., И в основном это прототип, но я уверен, вы понимаете, как при этом используется прокси-скрипт.
Передается переменная baseUrl, она должна содержать базу "http://server/theappname"мне нравится URL-адрес вашего приложения.