CakePHP 및 JQuery를 사용하여 크로스 도메인 Ajax 요청을 구현하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/660949

문제

프로젝트에 CakePHP를 사용하고 있으며 외부 웹 사이트에서 CRUD (CRUD)와 상호 작용할 수 있도록 XML보기를 생성하고 있습니다. CakePHP 웹 사이트에는 인증이 필요합니다.

본질적으로보고 싶다 "http://mycakeapp.com/posts/views/1.xml" 에서 "http://www.example.com"

그러나 jQuery의 ajax 함수를 사용할 때이 오류가 발생합니다. 제한된 URI에 대한 액세스 거부 "코드 :"1012. GOGLING에서 JSONP를 시도하는 것은 옵션 인 것 같습니다. 그러나 케이크에 고유하지 않으므로 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 요청에서 얻은 응답을 ECO로 가져 가면 좋을 것입니다.

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 함수는 MAP 서버에서 간단한 URL 문자열을 가져 오는 데 사용됩니다. 실패 여부는 신경 쓰지 않으므로 OnFailure 등이 없으며 대부분 프로토 타입이지만이 방법에 대한 아이디어를 얻을 수 있다고 확신합니다. 프록시 스크립트를 사용합니다.

BaseUrl 변수가 전달되며 기본이 포함되어야합니다. "http : // server/theappname"앱의 URL처럼.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top