Сведения о вопросе

Getthesound

07:27, 1st October, 2020

Теги

Cross Domain XmlHttpRequest

Просмотров: 450   Ответов: 8

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

Целый день сегодня мучаюсь с вышеозначенной темой. Изначальная задача:
Выполняясь на 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 — не подошло

Какие есть еще идеи как это побороть?



  Сведения об ответе

Chhiki

18:29, 29th September, 2020

Так вам надо получить ответ или нет?

Если нет задачи обязательно получить ответ, то:
  • создаем скрытый ифрейм c атрибутом name=«blahblah»
  • ставим форме атрибут target=«blahblah»
  • PROFIT!


  Сведения об ответе

DINO

10:30, 30th September, 2020

В чужой 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. Не уверен, что это будет работать везде.


  Сведения об ответе

VCe znayu

14:11, 27th September, 2020

А вот так пробовали?
habrahabr.ru/blogs/webdev/114432/


  Сведения об ответе

прога

12:05, 25th September, 2020

Не подходит, к сожалению, т.к. xxx.site.com проверяет Origin, а браузер в Origin ставит site.com


  Сведения об ответе

VCe znayu

21:42, 28th September, 2020

Сам этим не занимался, но на 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), которая должна помощь в решении вопроса.


  Сведения об ответе

PROGA

14:10, 27th September, 2020

Попробуйте способы из этого комментария habrahabr.ru/blogs/webdev/114432/#comment_3692960


  Сведения об ответе

DINO

22:12, 30th September, 2020

Наверняка, уже изучили, но всё же — javascript.ru/ajax/cross-domain-scripting.


  Сведения об ответе

davran

08:32, 28th September, 2020

Человек выше написал правильно, если нет задачи получить ответ, то можно создать формочку, айфрейм, дать формочке таргет созданный айфрейм, и сделать сабмит.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться