3

私は自分のプロジェクトに CakePHP を使用しており、XML ビューを生成して、外部 Web サイトから対話 (CRUD) できるようにしています。CakePHP Web サイトでは認証が必要です。

基本的に、「 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 "ですが、

以前にこの問題に取り組んだ人はいますか?

更新:もう少し具体的に言うと、自分の Web サイト (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 変数が渡されます。これには、アプリの URL のようなベース " http://server/theappname " が含まれている必要があります。

于 2009-03-19T13:44:09.077 に答える
0

JSONP は間違いなくあなたが探しているものです。

次のページが役立つかもしれません: http://www.ibm.com/developerworks/xml/library/x-xml2jsonphp/

于 2009-03-25T11:24:41.770 に答える