Access-Control-Allow-Origin-localhost
у меня проблемы с получением json через ajax, ошибка ниже. Согласно информации, которую я нашел до сих пор относительно ошибки, это, похоже, какая-то междоменная проблема, но я понятия не имею, что это значит и как ее решить.
может возникнуть проблема с заголовком ответа (я сам создал API и не имею опыта с тех пор), однако 200 OK получен при доступе к url-адресу непосредственно в браузере.
при обращении url непосредственно в браузере отображается действительный json, так что это не должно быть проблемой.
как это можно решить?
Примечание: url-адрес идет на сервер Apache, а не файл, который был в случае 95% вопросов здесь в стеке, которые я читал об этой проблеме.
ошибка в инспекторе:
XMLHttpRequest cannot load http://localhost/api/v1/products?_=1355583847077.
Origin null is not allowed by Access-Control-Allow-Origin.
Error: error
код:
$.ajaxSetup ({
url: "http://localhost/api/v1/products", // <--- returns valid json if accessed in the browser
type: "GET",
dataType: "json",
cache: false,
contentType: "application/json"
})
$.ajax({
success: function(data){
console.log("You made it!");
},
error: function(xhr) {
console.log("Error: " + xhr.statusText);
}
}).done(function(data){
console.log(data);
})
Params
_ 1355583610778
заголовки
Заголовки Ответа:
Connection Keep-Alive
Content-Length 3887
Content-Type application/json
Date Sat, 15 Dec 2012 14:50:53 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By PHP/5.3.1
Запрос Заголовков:
Accept application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language sv-SE,sv;q=0.8,en-US;q=0.5,en;q=0.3
Connection keep-alive
Host localhost
Origin null
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:17.0) Gecko/17.0 Firefox/17.0
ответ
ничего здесь...
5 ответов
попробуйте реализовать некоторую форму JSONP механизм. Если вы используете PHP, это может быть что-то простое...
/* If a callback has been supplied then prepare to parse the callback
** function call back to browser along with JSON. */
$jsonp = false;
if ( isset( $_GET[ 'callback' ] ) ) {
$_GET[ 'callback' ] = strip_tags( $_GET[ 'callback' ] );
$jsonp = true;
$pre = $_GET[ 'callback' ] . '(';
$post = ');';
} //isset( $_GET[ 'callback' ] )
/* Encode JSON, and if jsonp is true, then ouput with the callback
** function; if not - just output JSON. */
$json = json_encode( /* data here */ );
print( ( $jsonp ) ? $pre . $json . $post : $json );
все это будет делать, это проверить на $_GET
дисп назвал обратный звонок, а затем оберните вывод в вызов функции-принимая $_GET['callback']
name как имя функции.
тогда ваш вызов AJAX становится чем-то вроде этого...
$.ajax({
type: 'GET',
url: '/* script here */ ',
data: /* data here - if any */,
contentType: "jsonp", // Pay attention to the dataType/contentType
dataType: 'jsonp', // Pay attention to the dataType/contentType
success: function (json) {
/* call back */
}
});
когда jQuery дается 'jsonp'
как тип данных / contentType это будет позаботьтесь о предоставлении вам имени функции обратного вызова - и настройке функции обратного вызова и т. д.; Это означает, что вам не нужно ничего делать!
из документации jQuery:
"jsonp": загружается в блок JSON с помощью JSONP. Добавляет дополнительный "?обратного вызова=?"до конца вашего URL, чтобы указать обратный вызов. Отключает кэширование, добавляя параметр строки запроса "_=[TIMESTAMP] " к URL-адресу, если параметр кэша не имеет значения истинный.
в заключение; JSONP будет вашим лучшим выбором - я включил PHP-код в вероятность того, что ваш скрипт на стороне сервера использует PHP; если нет, то принципы те же. Однако материал jQuery/client остается неизменным независимо от технологий на стороне сервера. (в общем)
удачи :)
Да, это определенно междоменная проблема. Но не волнуйтесь, есть два решения этой проблемы.
использование JSONP
вы можете реализовать поддержку JSONP (JSON с дополнением) на сервере (т. е. решение Фергуса Морроу). JSONP работает в междоменном вне коробки и в основном JSON дополняется вызовом функции.
в своем .ajaxSetup
set dataType
to jsonp
, а затем на стороне сервера, вы должны обязательно проверить параметр url-адреса имени callback
в запросе. Если этот параметр установлен, ответ JSON должен быть дополнен соответствующим образом.
parseThis({ "json": "can", "be": "put", "in": "here" });
выше предполагает callback
установлено значение parseThis
. jQuery будет по умолчанию указывается имя функции, но вы можете переопределить это значение jsonpCallback
в своем .ajaxSetup
.
вы также можете использовать ярлык, чтобы сообщить jQuery, что вы запрашиваете JSONP, просто добавив ?callback=?
к url-адресу запроса.
используя Access-Control-Allow-Origin
альтернативным решением является установка Access-Control-Allow-Origin
заголовок в вашем ответе.
Access-Control-Allow-Origin: *
вышеуказанное позволит любой ресурс для использования междоменного сервиса. Прочтите статью, связанную ниже, для получения дополнительной информации о том, как настроить Access-Control-Allow
.
если вы хотите узнать больше о Access-Control-Origin и CORS, я рекомендую эта статья о MDN.
Я решил это очень простым способом, добавив следующий заголовок к моему коду сервера (php):
header('Access-Control-Allow-Origin: *');
Если это ASP.NET веб-приложение, то вы также можете поместить это в свой глобальный.aspx:
HttpContext.Текущий.Ответ.AddHeader ("Access-Control-Allow-Origin","*");
дополнительные настройки заголовка PHP
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type');
Удачи