Межсайтовые XMLHttpRequests могут быть выполнены только в браузерах, которые реализуют спецификацию W3C Cross-Origin Resource Sharing и если сервер возвращает соответствующие заголовки контроля доступа (см. MDC статья ) Например:
Access-Control-Allow-Origin: *
Но это реализовано не всеми браузерами. Единственный надежный способ выполнения межсайтовых запросов - использовать JSONP , для (непроверенного) примера:
(function() {
function shorten(ref, callback){
var callbackFuncName = 'esvapiJSONPCallback' + (new Date()).valueOf();
var script = document.createElement('script');
script.type = "text/javascript";
script.src = "http://esv.to/api/" + escape(ref) + "?callback=" + callbackFuncName;
window[callbackFuncName] = function(shorturl){
script.parentNode.removeChild(script);
window.callbackFuncName = null;
delete window[callbackFuncName];
callback(shorturl);
};
document.getElementsByTagName("head")[0].appendChild(script);
}
var ref = prompt("Enter a scripture reference or keyword search to link to:", "");
shorten(ref, function(shorturl) {
prompt("Here is your shortened ESV URL:", shorturl);
});
})();
Когда сервер видит параметр callback
, он должен будет вернуть text/javascript
вместо text/plain
, и тело ответа необходимо будет заключить в вызов предоставленного обратного вызова, например:
<?php
#... after $shorturl is set ...
if(isset($_GET['callback'])){
header('Content-Type: text/javascript');
$callback = preg_replace('/\W+/', '', $_GET['callback']); #sanitize
print $callback . "(" . json_encode($shorturl) . ");";
}
else {
header("Content-Type: text/plain");
print $shorturl;
}
?>