6

Как отправить POST-запрос между доменами с помощью JavaScript?

13

Заголовок: Как отправить POST-запрос между доменами с помощью JavaScript?

Описание проблемы:

Я пытаюсь отправить POST-запрос между доменами с помощью JavaScript, но сталкиваюсь с проблемами. Основные требования:

  1. Запрос не должен перезагружать страницу.
  2. Мне необходимо получить и разобрать ответ после выполнения запроса.

Как мне правильно реализовать это? Какие подходы или библиотеки вы можете порекомендовать для решения данной задачи? Заранее спасибо за помощь!

5 ответ(ов)

0

Если вы хотите выполнить отправку данных с помощью iframe, вот шаги, которые вам нужно выполнить, описанные в виде псевдокода:

  1. Создайте iframe.
  2. Вставьте в него форму с скрытыми полями.
  3. Установите атрибут action формы на нужный URL.
  4. Добавьте iframe в документ.
  5. Отправьте форму.

Вот пример псевдокода:

var ifr = document.createElement('iframe');
var frm = document.createElement('form');
frm.setAttribute("action", "yoururl");
frm.setAttribute("method", "post");

// Создайте скрытые поля ввода и добавьте их
// Не показано, но аналогично (создать, установить атрибут, appendChild)

ifr.appendChild(frm);
document.body.appendChild(ifr);
frm.submit();

Обратите внимание, что вам, вероятно, потребуется стилизовать iframe, чтобы он был скрыт и абсолютно позиционирован. Также имейте в виду, что кросс-доменные запросы могут быть ограничены браузером, но если это разрешено, то данный способ поможет вам выполнить задачу.

0

Вот перевод вашего вопроса на русский, в стиле ответа на StackOverflow.com:


Чтобы сделать POST-запрос между доменами:

Используйте crossDomain: true,

Что касается необновления страницы:

Нет, страница не обновится, так как функции обратного вызова success или error будут вызваны, когда сервер вернет ответ.


Пример кода:

$.ajax({
    type: "POST",
    url: "http://www.yoururl.com/",
    crossDomain: true,
    data: 'param1=value1&param2=value2',
    success: function (data) {
        // сделайте что-то с данными ответа сервера
    },
    error: function (err) {
        // обработка ошибок
    }
});

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!

0

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

PHP:

header('Access-Control-Allow-Origin: *');

Например, в коде xmlrpc.php в Drupal вы можете сделать это следующим образом:

function xmlrpc_server_output($xml) {
    $xml = '<?xml version="1.0"?>'."\n". $xml;
    header('Connection: close');
    header('Content-Length: '. strlen($xml));
    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/x-www-form-urlencoded');
    header('Date: '. date('r'));
    // $xml = str_replace("\n", " ", $xml); 

    echo $xml;
    exit;
}

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

0

Проверьте функцию post_method в файле http://taiyolab.com/mbtweet/scripts/twitterapi_call.js - это хороший пример использования метода iframe, описанного выше.

0

Чтобы выполнить описанную задачу, выполните следующие шаги:

  1. Создайте два скрытых iframe, добавив к CSS-стилю свойство display: none;. Убедитесь, что во втором iframe у вас указано что-то на вашем собственном домене. Например:

    <iframe id="iframe1" style="display: none;"></iframe>
    <iframe id="iframe2" src="https://ваш-домен.com" style="display: none;"></iframe>
    
  2. Создайте скрытую форму, установив метод post, указав target равным вашему первому iframe. Опционально, вы можете установить enctype на multipart/form-data, если вам нужно отправить мультимедийные данные, такие как изображения:

    <form id="hiddenForm" method="post" action="https://ваш-домен.com/upload" target="iframe1" enctype="multipart/form-data" style="display: none;">
        <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </form>
    
  3. Когда вы будете готовы к отправке, выполните метод submit() для формы:

    document.getElementById('hiddenForm').submit();
    
  4. Если вы можете настроить другое доменное имя так, чтобы оно возвращало JavaScript, позволяющий осуществлять междоменное взаимодействие через iframe (вы можете почитать здесь), то вам повезло - вы сможете захватить ответ с другого домена, но это может потребовать дополнительных настроек.

В любом случае, если вы хотите использовать свой сервер в качестве прокси, вы можете избежать всех вышеперечисленных сложностей. Просто отправьте форму на ваш сервер, который проксирует запрос на другой сервер (при условии, что другой сервер не отслеживает различия IP), получит ответ и вернет результат, который вам нужен.

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