14 ответов:
использовать JSONP.
jQuery:
$.ajax({ url:"testserver.php", dataType: 'jsonp', // Notice! JSONP <-- P (lowercase) success:function(json){ // do stuff with json (in this case an array) alert("Success"); }, error:function(){ alert("Error"); } });PHP:
<?php $arr = array("element1","element2",array("element31","element32")); $arr['name'] = "response"; echo $_GET['callback']."(".json_encode($arr).");"; ?>эхо может быть неправильным, это было некоторое время, так как я использовал php. В любом случае вам нужно вывести
callbackName('jsonString')обратите внимание на кавычки. jQuery передаст свое собственное имя обратного вызова, поэтому вам нужно получить это из GET params.и как написал Стефан Кендалл,$.getJSON () это метод стенографии, но тогда вам нужно добавить
'callback=?'к url как получить параметр (да, ценность есть ?, jQuery заменяет это своим собственным сгенерированным методом обратного вызова).
JSONP-хороший вариант, но есть более простой способ. Вы можете просто установить
Access-Control-Allow-Originзаголовок на вашем сервере. Установка его в*будет принимать междоменные AJAX-запросы от любого домена. (https://developer.mozilla.org/en/http_access_control)метод для этого варьируется от языка к языку, конечно. Вот он в рельсах:
class HelloController < ApplicationController def say_hello headers['Access-Control-Allow-Origin'] = "*" render text: "hello!" end endв этом примере
say_helloдействие будет принимать запросы AJAX от любого домена и возвращать a Ответ: "Здравствуйте!".вот пример заголовков, которые он может вернуть:
HTTP/1.1 200 OK Access-Control-Allow-Origin: * Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Type: text/html; charset=utf-8 X-Ua-Compatible: IE=Edge Etag: "c4ca4238a0b923820dcc509a6f75849b" X-Runtime: 0.913606 Content-Length: 6 Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09) Date: Thu, 01 Mar 2012 20:44:28 GMT Connection: Keep-Aliveлегко, как это, у него есть некоторые ограничения браузера. Смотрите http://caniuse.com/#feat=cors.
вы можете управлять этим через HTTP-заголовок, добавив Access-Control-Allow-Origin. Установка * приму кросс-доменные AJAX-запросы с любого домена.
С помощью PHP Это очень просто, просто добавьте следующую строку в скрипт, который вы хотите иметь доступ к за пределами вашего домена:
header("Access-Control-Allow-Origin: *");Не забудьте включить модуль mod_headers в httpd.конф.
вы должны взглянуть на Та Же Политика Происхождения:
в вычислениях, та же политика происхождения это важная концепция безопасности количество веб-программирование языки, такие как JavaScript. Этот политика разрешает выполнение сценариев страницы, происходящие с одного сайта чтобы получить доступ к методам друг друга и свойства без конкретного ограничений, но предотвращает доступ к большинство методов и свойств по страницы на разных места.
чтобы вы могли получить данные, это должно быть:
тот же протокол и хост
нужно реализовать JSONP чтобы обойти его.
мне пришлось загрузить веб-страницу с локального диска " file:// / C: / test / htmlpage.html", call "http://localhost/getxml.PHP " url, и сделайте это в браузерах IE8+ и Firefox12+, используйте jQuery v1.7.2 lib для минимизации шаблонного кода. После прочтения десятков статей, наконец, понял это. Вот мое резюме.
- серверный скрипт (.РНР. ,JSP-страница. ,..) должен возвращать заголовок ответа http Access-Control-Allow-Origin: *
- перед использованием jQuery ajax установите этот флаг в javascript: jQuery.поддержка.cors = true;
- вы можете установить флаг один раз или каждый раз перед использованием функции jQuery ajax
- теперь я могу читать .xml-документ в IE и Firefox. Другие браузеры я не тестировал.
- ответ документ может быть простой / текст, xml, json или что-нибудь еще
вот пример вызова jQuery ajax с некоторыми отладочными sysouts.
jQuery.support.cors = true; $.ajax({ url: "http://localhost/getxml.php", data: { "id":"doc1", "rows":"100" }, type: "GET", timeout: 30000, dataType: "text", // "xml", "json" success: function(data) { // show text reply as-is (debug) alert(data); // show xml field values (debug) //alert( $(data).find("title").text() ); // loop JSON array (debug) //var str=""; //$.each(data.items, function(i,item) { // str += item.title + "\n"; //}); //alert(str); }, error: function(jqXHR, textStatus, ex) { alert(textStatus + "," + ex + "," + jqXHR.responseText); } });
Это правда, что политика одного и того же источника запрещает JavaScript делать запросы через домены, но спецификация CORS позволяет именно такой доступ к API, который вы ищете, и поддерживается текущей партией основных браузеров.
см. раздел включение совместного использования ресурсов между источниками для клиента и сервера:
" Cross-Origin Resource Sharing (CORS) - это спецификация, которая обеспечивает действительно открытый доступ через доменные границы. Если вы обслуживаете публичный контент, пожалуйста, рассмотрите возможность использования CORS, чтобы открыть его для универсального доступа к JavaScript/браузеру."
Это возможно, но вам нужно использовать JSONP, а не JSON. Связь Стефана указала тебе в правильном направлении. Элемент jQuery AJAX page имеет дополнительную информацию о JSONP.
Реми Шарп имеет подробный пример использования PHP.
Я использую сервер Apache, поэтому я использовал модуль mod_proxy. Включить модули:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.soпотом добавил:
ProxyPass /your-proxy-url/ http://service-url:serviceport/и, наконец, пройти прокси-URL-адрес вашего скрипта.
безопасность браузера предотвращает вызов ajax со страницы, размещенной в одном домене, на страницу, размещенную в другом домене; это называется" политика того же происхождения".
есть несколько примеров использования JSONP, которые включают обработку ошибок.
однако, обратите внимание, что ошибка-событие не запускается при использовании JSONP! Смотрите: http://api.jquery.com/jQuery.ajax/ или jQuery ajax запрос с помощью ошибки jsonp
из документов Jquery (ссылке):
из-за ограничений безопасности браузера большинство запросов "Ajax" подчиняются одной и той же политике происхождения; запрос не может успешно извлекать данные из другого домена, поддомена или протокола.
на запросы Script и JSONP не распространяются одинаковые ограничения политики происхождения.
поэтому я бы взял, что вам нужно использовать jsonp для запроса. Но не пробовал это сам.
Я знаю 3 способа решения проблемы:
во-первых, если у вас есть доступ к обоим доменам, вы можете разрешить доступ для всех остальных доменов с помощью :
header("Access-Control-Allow-Origin: *");или просто домен, добавив код ниже .файл htaccess:
<FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin= Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>вы можете иметь ajax-запрос к php-файлу на вашем сервере и обрабатывать запрос к другому домену с помощью этого php-файла.
- вы можете использовать jsonp , потому что для этого не нужно разрешение. для этого вы можете прочитать наш друг @BGerrissen ответ.
для Microsoft Azure это немного отличается.
Azure имеет специальный параметр CORS, который необходимо установить. Это по сути то же самое за кулисами, но просто установка заголовка joshuarh упоминает не будет работать. Документацию Azure для включения кросс-домена можно найти здесь:
https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript
я возился с это в течение нескольких часов, прежде чем понять, что моя хостинг-платформа имела эту специальную настройку.
это работает, все, что вам нужно:
PHP:
header('Access-Control-Allow-Origin: http://www.example.com'); header("Access-Control-Allow-Credentials: true"); header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');JS (jQuery ajax):
var getWBody = $.ajax({ cache: false, url: URL, dataType : 'json', type: 'GET', xhrFields: { withCredentials: true } });
Comments