Pergunta

Eu estou usando CakePHP para o meu projeto, e eu estou gerando visões XML para que eu possa interagir com eles (CRUD) a partir de um site externo. Não é necessária autenticação no site do CakePHP.

Essencialmente, eu quero ver " http://mycakeapp.com/posts/views/ 1.xml " de " http://www.example.com "

No entanto, eu recebo este erro ao utilizar a função ajax do jQuery: Acesso a URI restrito negado "código:" 1012 . Parece que a partir googling que talvez tentando JSONP é uma opção .. mas não é nativa do bolo e, portanto, eu prefiro usar xml: (

Eu tentei usar um iframe: ele carrega a tela de login - e depois de eu login, ele carrega a página atual (por exemplo, " http://www.example.com ")! Mesmo que a fonte iframe é " http://mycakeapp.com/posts/views/1.xml "

Alguém já abordou este problema antes?

Update: Para ser um pouco mais específico, eu gostaria de criar um bookmarklet que se comunica com o meu site (construída sobre CakePHP), assim que um método de proxy url não vai funcionar (mas obrigado por a sugestão)

Foi útil?

Solução

JSONP é definitivamente o que você está procurando.

Talvez a seguinte página poderia ajudá-lo: http: // www. ibm.com/developerworks/xml/library/x-xml2jsonphp/

Outras dicas

Basta fazer um script de proxy em PHP. deixar o Ajax solicitar seu script proxy, tem seu script proxy "para a frente" o seu pedido através do domínio usando cURL, simplesmente tem o seu eco script de proxy para fora a resposta que você recebe do seu pedido cURL, e você vai ser bom para ir.

Como mmattax mencionado, a maneira mais fácil de fazer isso é usando um script de proxy.

Aqui está um script que eu uso para chamar para outro domínio, passando a ele um parâmetro 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);
?>

No seu caso, você pode querer alterar o erro de manipulação pouco para voltar um pouco válida de xml que a sua aplicação pode analisar.

Eu costumo colocar isso no meu webroot, e chamá-lo de javascript com algo como:

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});
        }
    });
}

A função exemplo javascript acima é usado para obter uma volta string url simples do nosso servidor de mapas, nós não nos importamos se ele falhar por isso não há onFailure etc, e é principalmente Prototype, mas eu tenho certeza que você começa a idéia sobre a forma como este utiliza o script proxy.

A variável baseURL é passado, ele deve conter a base " http: // server / theappname " como url para a sua aplicação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top