Cross Domain XmlHttpRequest

Добрый день, друзья.

Целый день сегодня мучаюсь с вышеозначенной темой. Изначальная задача:
Выполняясь на site.com отправить POST запрос (даже ответ не обязательно получать) на xxx.site.com. В крайнем случае готов ограничиться браузером Google Chrome.

Казалось бы, задача уже не нова, написана куча материалов на тему, но что-то ничего не срабатывает…

Итак, что я уже попробовал:
  1. подменить document.domain перед отправкой. Как оказалось, менять с xxx.site.com на site.com можно, а вот обратно — никак...
  2. создать iframe с src=«xxx.site.com», а затем внутри него добавить в дом модель тег script, который будет содержать в себе логику по отправлению XmlHttpRequest. И вот этот вариант уже почти-почти сработал, как по непонятным мне причинам xhr.readystatechange вызывается один раз и readyState=1… Код примерно такой:
    var iframe = $('<iframe src=«xxx.site.com» style=«display:none;»></iframe>').appendTo(document.body);
      var iDoc = iframe.get(0).contentDocument;
      var script = iDoc.createElement(«script»);
      script.setAttribute(«type», «text/javascript»);
      script.innerHTML =
          «function postIt() {» +
          «var xhr = new XMLHttpRequest();» +
          «xhr.onreadystatechange = function(data) {» +
              «alert(xhr.readyState);» +
          «if (xhr.readyState == 4) {» +
          "    if (xhr.status == 200) {" +
          "     alert(data.toString());" +
          "    } else {" +
          "     alert(xhr.error);" +
          "    }" +
          "}};" +

          «var url = \»xxx.site.com\";" +

          «var postParams = \»a=1&b=1\"" +

          «xhr.open(\»POST\", url, true);" +
          «xhr.setRequestHeader(\»Content-Type\", \«application/x-www-form-urlencoded;\»);" +
          «xhr.send(postParams);» +
        "}" +

        «postIt();»;

      iDoc.body.appendChild(script);


    * This source code was highlighted with Source Code Highlighter.

  3. Также рассмотрел способ с YQL — не подошло

Какие есть еще идеи как это побороть?
  • Вопрос задан
  • 8117 просмотров
Решения вопроса 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Так вам надо получить ответ или нет?

Если нет задачи обязательно получить ответ, то:
  • создаем скрытый ифрейм c атрибутом name=«blahblah»
  • ставим форме атрибут target=«blahblah»
  • PROFIT!
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
philpirj
@philpirj
В чужой iframe писать js никто не даст по политике безопасности.

Для решения проблемы могу посоветовать переделать серверную логику xxx.site.com, чтобы воспринимался GET равно как POST, и использовать JSONP.

Вариант второй можно использовать, если логику xxx.site.com не поправить: сделать у себя на хосте ресурс, на который отправлять POST, и делать HTTP запрос с сервера site.com на сервер xxx.site.com.

Можно ещё попробовать сделать скрытый form, поставить у него action в «xxx.site.com», добавить input'ов с нужными name и value, и выстрелить form submit. Не уверен, что это будет работать везде.
Ответ написан
ShimON
@ShimON Автор вопроса
Не подходит, к сожалению, т.к. xxx.site.com проверяет Origin, а браузер в Origin ставит site.com
Ответ написан
@Serator
Сам этим не занимался, но на hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ все прекрасно работает (смотрю в Firefox'e 4 beta 12, Chrom'а под рукой не наблюдается). Там есть примеры, которые можно «пощупать». + сатья ( developer.mozilla.org/en/HTTP_access_control ) на MDN (MDC), которая должна помощь в решении вопроса.
Ответ написан
@Dzen_Marketing
Попробуйте способы из этого комментария habrahabr.ru/blogs/webdev/114432/#comment_3692960
Ответ написан
Наверняка, уже изучили, но всё же — javascript.ru/ajax/cross-domain-scripting.
Ответ написан
Комментировать
taliban
@taliban
php программист
Человек выше написал правильно, если нет задачи получить ответ, то можно создать формочку, айфрейм, дать формочке таргет созданный айфрейм, и сделать сабмит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы