Подтвердить что ты не робот

Межсайтовые запросы AJAX

Мне нужно сделать запрос AJAX с веб-сайта на веб-службу REST, размещенную в другом домене.

Хотя это прекрасно работает в Internet Explorer, другие браузеры, такие как Mozilla и Google Chrome, накладывают гораздо более строгие ограничения безопасности, которые запрещают запросы AJAX на межсайтовых сайтах.

Проблема в том, что у меня нет контроля над доменом или веб-сервером, на котором размещен сайт. Это означает, что мой веб-сервис REST должен работать где-то в другом месте, и я не могу использовать какой-либо механизм перенаправления.

Вот код JavaScript, который делает асинхронный вызов:

var serviceUrl = "http://myservicedomain";
var payload = "<myRequest><content>Some content</content></myRequest>";
var request = new XMLHttpRequest();
request.open("POST", serviceUrl, true); // <-- This fails in Mozilla Firefox amongst other browsers
request.setRequestHeader("Content-type", "text/xml");
request.send(payload);

Как я могу работать в других браузерах рядом с Internet Explorer?

4b9b3361

Ответ 1

возможно JSONP может помочь.

NB вам нужно изменить свои сообщения, чтобы использовать json вместо xml

Изменить

Основные сайты, такие как flickr и twitter поддерживают jsonp с обратными вызовами и т.д.

Ответ 2

Сообщение, помеченное как ответ, ошибочно: документ iframes НЕ имеет доступа к родительскому элементу. Одна и та же политика происхождения работает в обоих направлениях.

Дело в том, что невозможно каким-либо образом потреблять веб-сервис, основанный на отдыхе, с помощью xmlhttprequest. Единственный способ загрузки данных из другого домена (без каких-либо фреймворков) - использовать JSONP. Любые другие решения требуют серверного прокси-сервера, расположенного в вашем собственном домене, или прокси-сервера на стороне клиента, расположенного в удаленном домене, и som-типа межсайтовой связи (например, easyXDM) для связи между документами.

Ответ 3

Тот факт, что это работает в IE, является проблемой безопасности с IE, а не с функцией.

К сожалению, межсайтовый скриптинг запрещен, а принятая работа - проксировать запросы через ваш собственный домен: действительно ли у вас нет возможности добавлять или изменять код на стороне сервера?

Кроме того, вторичное обходное решение, связанное с приобретением данных с помощью тегов script, будет только поддерживать запросы GET, которые вы могли бы взломать с помощью службы SOAP, но не столько с запросом POST на Служба RESTful, которую вы описываете.

Я действительно не уверен, что решение AJAX существует, вы можете вернуться к <form> Решение.

Ответ 4

Не очень четкое обходное решение (но работает) использует iframe в качестве контейнера для запросов на другие сайты. Проблема в том, что родитель не может получить доступ к содержимому iframe, может только ориентироваться на iframe "src" attribut. Но содержимое iframe может иметь доступ к родительскому контенту.

Итак, если информация iframe знает, они могут вызывать некоторый контент javascript на родительской странице или напрямую обращаться к родительскому DOM.

EDIT: Пример:

function ajaxWorkaroung() {
    var frm = gewtElementById("myIFrame")
    frm.src = "http://some_other_domain"
}
function ajaxCallback(parameter){
    // this function will be called from myIFrame content
}

Ответ 5

Сделайте свой домен службы принятым для совместного использования ресурсов (CORS).

Типичный сценарий. Большинство совместимых с CORS браузеров сначала отправляют заголовок OPTIONS, на который сервер должен возвращать информацию о том, какие заголовки принимаются. Если заголовки удовлетворяют требованиям к обслуживанию для предоставленного запроса (Разрешенные методы - это GET и POST, Allowed-Origin * и т.д.), Браузер затем повторно отправит запрос с помощью соответствующего метода (GET, POST и т.д.).

Все эти точки вперед такие же, как при использовании IE или, проще говоря, при отправке в тот же домен.

Caviots: Некоторые SDK разработки служб (в частности, WCF) будут пытаться обработать запрос, и в этом случае вам необходимо предварительно обработать метод OPTIONS для ответа на запрос и избежать того, что метод вызывается дважды на сервере.

Короче говоря, проблема лежит на стороне сервера.

Изменить Есть одна проблема с IE 9 и ниже с CORS, поскольку она не полностью реализована. К счастью, вы можете решить эту проблему, переведя свои вызовы из серверного кода в службу и вернитесь через свой сервер (например, mypage.aspx? Service = blah & method = blahblah & p0 = firstParam = something). Отсюда ваш код на стороне сервера должен реализовать модель потока запросов/ответов.

Ответ 7

Это также можно выполнить с помощью локальной настройки веб-сервера, которая вызывает завиток с правильными аргументами и возвращает вывод curl.

app.rb

require 'sinatra'
require 'curb'

set :views,lambda {"views/"+self.name.to_s.downcase.sub("controller","")}
set :haml, :layout => :'../layout', :format => :html5, :escape_html=>true
disable :raise_errors

get '/data/:brand' do
  data_link =  "https://externalsite.com/#{params[:brand]}"
  c = Curl::Easy.perform(data_link)
  c.body_str
end

Отправка запроса ajax на localhost: 4567/data/что-то вернет результат из externalsite.com/something.

Ответ 8

Другой вариант - установить запись CNAME в вашем собственном домене, чтобы "Маска" имя хоста удаленного домена.