3

我在我的项目中使用 CakePHP,并且我正在生成 XML 视图,以便我可以从外部网站与它们交互 (CRUD)。CakePHP 网站需要认证。

本质上,我想从“ http://www.example.com ”查看“ http://mycakeapp.com/posts/views/1.xml ”

但是,使用 jQuery 的 ajax 函数时出现此错误:访问受限 URI 被拒绝”代码:“1012。从谷歌搜索看来,也许尝试 JSONP 是一种选择.. 但它不是蛋糕原生的,因此我宁愿使用 xml :(

我尝试过使用 iframe:它会加载登录屏幕 - 在我登录后,它会加载当前页面(例如“ http://www.example.com ”)!即使 iframe 源是“ http://mycakeapp.com/posts/views/1.xml

有没有人解决过这个问题?

更新:更具体地说,我想创建一个与我的网站通信的书签(基于 CakePHP),因此 url 代理方法不起作用(但感谢您的建议)

4

3 回答 3

4

只需在 PHP 中制作一个代理脚本。让 Ajax 请求您的代理脚本,让您的代理脚本使用 cURL 在整个域中“转发”您的请求,只需让您的代理脚本回显您从 cURL 请求中获得的响应,您就可以开始了。

于 2009-03-19T03:39:57.283 回答
3

正如 mmattax 提到的,最简单的方法是使用代理脚本。

这是我用来调用另一个域的脚本,将一个 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 字符串,我们不关心它是否失败,所以没有 onFailure 等,它主要是原型,但我相信你明白这是怎么回事使用代理脚本。

baseURL 变量被传入,它应该包含基本的“ http://server/theappname ”,比如你的应用程序的 url。

于 2009-03-19T13:44:09.077 回答
0

JSONP 绝对是您正在寻找的。

也许以下页面可以帮助您:http ://www.ibm.com/developerworks/xml/library/x-xml2jsonphp/

于 2009-03-25T11:24:41.770 回答