Загрузка междоменной конечной точки с помощью jQuery AJAX
Я пытаюсь загрузить междоменную HTML-страницу с помощью AJAX, но если dataType не "jsonp", я не могу получить ответ. Однако, используя jsonp, браузер ожидает тип mime script, но получает "text/html".
Мой код для запроса:
$.ajax({
type: "GET",
url: "http://saskatchewan.univ-ubs.fr:8080/SASStoredProcess/do?_username=DARTIES3-2012&[email protected]&_program=%2FUtilisateurs%2FDARTIES3-2012%2FMon+dossier%2Fanalyse_dc&annee=2012&ind=V&_action=execute",
dataType: "jsonp",
}).success( function( data ) {
$( 'div.ajax-field' ).html( data );
});
Есть ли способ избежать использования jsonp для запроса? Я уже пробовал использовать параметр crossDomain, но он не работал.
Если нет способа получить содержимое html в jsonp? В настоящее время консоль говорит "неожиданно <". в ответе jsonp.
Ответы
Ответ 1
jQuery Ajax Notes
- Из-за ограничений безопасности браузера большинство Ajax запросов подчиняются той же политике происхождения; запрос не может успешно извлекать данные из другого домена, субдомена, порта или протокола.
- Script, а запросы JSONP не подпадают под одни и те же ограничения политики происхождения.
Есть несколько способов преодоления барьера междоменного:
Есть несколько плагинов, которые помогают с междоменными запросами:
Heads up!
Лучший способ преодолеть эту проблему - создать собственный прокси-сервер в фоновом режиме, чтобы ваш прокси указывать на службы в других доменах, потому что в фоновом режиме не существует того же самого источника политика. Но если вы не можете сделать это в фоновом режиме, обратите внимание на следующие советы.
<ч/" > Внимание!
Использование сторонних прокси-серверов не является безопасной практикой, поскольку они могут отслеживать ваши данные, поэтому их можно использовать с общедоступной информацией, но никогда с частными данными.
<ч/" > В приведенных ниже примерах кода используйте jQuery.get() и jQuery.getJSON(), оба являются сокращенными методами jQuery.ajax()
<ч/" >
CORS Anywhere
CORS Anywhere - это node.js proxy, который добавляет заголовки CORS к прокси-запросу.
Чтобы использовать API, просто префикс URL с URL-адресом API. (Поддерживается https: см. репозиторий github)
Если вы хотите автоматически активировать междоменные запросы по мере необходимости, используйте следующий фрагмент:
$.ajaxPrefilter( function (options) {
if (options.crossDomain && jQuery.support.cors) {
var http = (window.location.protocol === 'http:' ? 'http:' : 'https:');
options.url = http + '//cors-anywhere.herokuapp.com/' + options.url;
//options.url = "http://cors.corsproxy.io/url=" + options.url;
}
});
$.get(
'http://en.wikipedia.org/wiki/Cross-origin_resource_sharing',
function (response) {
console.log("> ", response);
$("#viewer").html(response);
});
<ч/" >
Независимо от происхождения
Независимо от того, что происходило, это доступ к перекрестному домену jsonp. Это альтернатива с открытым исходным кодом для anyorigin.com.
Чтобы получить данные с google.com, вы можете использовать этот фрагмент:
// It is good specify the charset you expect.
// You can use the charset you want instead of utf-8.
// See details for scriptCharset and contentType options:
// http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
$.ajaxSetup({
scriptCharset: "utf-8", //or "ISO-8859-1"
contentType: "application/json; charset=utf-8"
});
$.getJSON('http://whateverorigin.org/get?url=' +
encodeURIComponent('http://google.com') + '&callback=?',
function (data) {
console.log("> ", data);
//If the expected response is text/plain
$("#viewer").html(data.contents);
//If the expected response is JSON
//var response = $.parseJSON(data.contents);
});
<ч/" >
Прокси-сервер CORS
CORS Proxy - это простой node.js прокси, чтобы включить запрос CORS для любого веб-сайта.
Это позволяет javascript-коду на вашем сайте получать доступ к ресурсам в других доменах, которые обычно блокируются из-за политики одного и того же происхождения.
Как это работает?
Прокси-сервер CORS использует преимущества совместного использования ресурсов Cross-Origin, который добавлен вместе с HTML 5. Серверы могут указать, что они хотят, чтобы браузеры разрешали другим веб-сайтам запрашивать ресурсы, которые они размещают. Прокси CORS - это просто HTTP-прокси, который добавляет заголовок к ответам, говоря "любой может запросить это".
Это еще один способ достижения цели (см. www.corsproxy.com). Все, что вам нужно сделать, это strip http:// и www. из проксированного URL-адреса и добавить URL-адрес с помощью www.corsproxy.com/
$.get(
'http://www.corsproxy.com/' +
'en.wikipedia.org/wiki/Cross-origin_resource_sharing',
function (response) {
console.log("> ", response);
$("#viewer").html(response);
});
<ч/" >
Прокси-сервер CORS
Недавно я нашел это, он включает в себя различные средства безопасности Cross Origin Remote Sharing. Но это черный ящик с Flash в качестве бэкэнда.
Вы можете увидеть это в действии здесь: Прокси-сервер CORS
Получить исходный код на GitHub: koto/cors-proxy-browser
Ответ 2
Вы можете использовать Ajax-cross-origin плагин jQuery.
С помощью этого плагина вы используете jQuery.ajax()
кросс-домен. Для этого используются сервисы Google.
Плагин AJAX Cross Origin использует Google Apps Script как прокси-сервер jSON getter, где jSONP не реализован. Когда вы устанавливаете crossOrigin option to true, плагин заменит оригинальный URL с помощью Google Apps Script и отправить его как параметр кодированного URL-адреса. Google Приложения Script используют ресурсы Google Servers для получения удаленных данных и верните его обратно клиенту как JSONP.
Это очень просто использовать:
$.ajax({
crossOrigin: true,
url: url,
success: function(data) {
console.log(data);
}
});
Вы можете прочитать больше здесь:
http://www.ajax-cross-origin.com/
Ответ 3
Если внешний сайт не поддерживает JSONP или CORS, единственным вариантом является использование прокси.
Создайте script на своем сервере, который запрашивает этот контент, а затем используйте jQuery ajax для доступа к script на вашем сервере.
Ответ 4
Просто поместите это в заголовок своей страницы PHP и плохо работайте без API:
header('Access-Control-Allow-Origin: *'); //allow everybody
или
header('Access-Control-Allow-Origin: http://codesheet.org'); //allow just one domain
или
$http_origin = $_SERVER['HTTP_ORIGIN']; //allow multiple domains
$allowed_domains = array(
'http://codesheet.org',
'http://stackoverflow.com'
);
if (in_array($http_origin, $allowed_domains))
{
header("Access-Control-Allow-Origin: $http_origin");
}
Ответ 5
Я публикую это на случай, если кто-то столкнется с той же проблемой, с которой я сейчас сталкиваюсь. У меня есть тепловизионный принтер Zebra, оснащенный сервером печати ZebraNet, который предлагает пользовательский интерфейс на основе HTML для редактирования нескольких параметров, просмотра текущего состояния принтера и т.д. Мне нужно получить статус принтера, который отображается на одной из этих html-страниц, предлагаемой сервером ZebraNet, и, например, alert() сообщение пользователю в браузере. Это означает, что я должен сначала получить эту страницу html в Javascript. Хотя принтер находится в локальной сети ПК пользователя, "Одинаковая политика происхождения" по-прежнему остается на моем пути. Я попробовал JSONP, но сервер возвращает html, и я не нашел способ изменить его функциональность (если бы мог, я бы уже установил волшебный заголовок Access-control-allow-origin: *). Поэтому я решил написать небольшое консольное приложение на С#. Он должен работать как администратор для правильной работы, иначе он троллирует: D - исключение. Вот какой код:
// Create a listener.
HttpListener listener = new HttpListener();
// Add the prefixes.
//foreach (string s in prefixes)
//{
// listener.Prefixes.Add(s);
//}
listener.Prefixes.Add("http://*:1234/"); // accept connections from everywhere,
//because the printer is accessible only within the LAN (no portforwarding)
listener.Start();
Console.WriteLine("Listening...");
// Note: The GetContext method blocks while waiting for a request.
HttpListenerContext context;
string urlForRequest = "";
HttpWebRequest requestForPage = null;
HttpWebResponse responseForPage = null;
string responseForPageAsString = "";
while (true)
{
context = listener.GetContext();
HttpListenerRequest request = context.Request;
urlForRequest = request.RawUrl.Substring(1, request.RawUrl.Length - 1); // remove the slash, which separates the portNumber from the arg sent
Console.WriteLine(urlForRequest);
//Request for the html page:
requestForPage = (HttpWebRequest)WebRequest.Create(urlForRequest);
responseForPage = (HttpWebResponse)requestForPage.GetResponse();
responseForPageAsString = new StreamReader(responseForPage.GetResponseStream()).ReadToEnd();
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Send back the response.
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseForPageAsString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
response.AddHeader("Access-Control-Allow-Origin", "*"); // the magic header in action ;-D
System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
// You must close the output stream.
output.Close();
//listener.Stop();
Все, что нужно сделать пользователю, - это запустить консольное приложение в качестве администратора. Я знаю, что это тоже... разочарование и сложность, но это своего рода обходной путь к проблеме политики домена, если вы не можете каким-либо образом изменить сервер.
edit: from js Я делаю простой вызов ajax:
$.ajax({
type: 'POST',
url: 'http://LAN_IP:1234/http://google.com',
success: function (data) {
console.log("Success: " + data);
},
error: function (e) {
alert("Error: " + e);
console.log("Error: " + e);
}
});
html запрашиваемой страницы возвращается и сохраняется в переменной datastrong > .
Ответ 6
Чтобы получить внешний вид данных на внешнем сайте, пропустив его с помощью локального прокси-сервера, как предложено jherax, вы можете создать страницу php, которая выберет контент для вас из соответствующего внешнего URL-адреса, и отправить запрос на получение этой php-страницы.
var req = new XMLHttpRequest();
req.open('GET', 'http://localhost/get_url_content.php',false);
if(req.status == 200) {
alert(req.responseText);
}
как php proxy вы можете использовать https://github.com/cowboy/php-simple-proxy
Ответ 7
Ваш URL
не работает в эти дни, но ваш код может быть обновлен с помощью этого рабочего решения:
var url = "http://saskatchewan.univ-ubs.fr:8080/SASStoredProcess/do?_username=DARTIES3-2012&[email protected]&_program=%2FUtilisateurs%2FDARTIES3-2012%2FMon+dossier%2Fanalyse_dc&annee=2012&ind=V&_action=execute";
url = 'https://google.com'; // TEST URL
$.get("https://images"+~~(Math.random()*33)+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=" + encodeURI(url), function(data) {
$('div.ajax-field').html(data);
});
<div class="ajax-field"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Ответ 8
Вам нужен прокси-сервер CORS, который проксирует ваш запрос из вашего браузера, чтобы запросить сервис с соответствующими заголовками CORS. Список таких сервисов приведен ниже. Вы также можете запустить предоставленный фрагмент кода, чтобы просмотреть ping для таких служб из вашего местоположения.
$('li').each(function() {
var self = this;
ping($(this).text()).then(function(delta) {
console.log($(self).text(), delta, ' ms');
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/jdfreder/pingjs/c2190a3649759f2bd8569a72ae2b597b2546c871/ping.js"></script>
<ul>
<li>https://crossorigin.me/</li>
<li>https://cors-anywhere.herokuapp.com/</li>
<li>http://cors.io/</li>
<li>https://cors.5apps.com/?uri=</li>
<li>http://whateverorigin.org/get?url=</li>
<li>https://anyorigin.com/get?url=</li>
<li>http://corsproxy.nodester.com/?src=</li>
<li>https://jsonp.afeld.me/?url=</li>
<li>http://benalman.com/code/projects/php-simple-proxy/ba-simple-proxy.php?url=</li>
</ul>
Ответ 9
Выяснил это.
Используется вместо этого.
$('.div_class').load('http://en.wikipedia.org/wiki/Cross-origin_resource_sharing #toctitle');