Как отправить междоменный POST-запрос через JavaScript? - PullRequest
540 голосов
/ 18 ноября 2008

Как отправить междоменный запрос POST через JavaScript?

Примечания - это не должно обновлять страницу, и мне нужно впоследствии получить и проанализировать ответ.

Ответы [ 17 ]

3 голосов
/ 04 октября 2011

Я думаю, что лучший способ - это использовать XMLHttpRequest (например, $ .ajax (), $ .post () в jQuery) с одним из полифилов общего доступа к ресурсам https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#wiki-CORS

3 голосов
/ 19 августа 2009

Высокий уровень .... Вам необходимо настроить cname на своем сервере, чтобы other-serve.your-server.com указывал на other-server.com.

Ваша страница динамически создает невидимый iframe, который служит вашим транспортом на other-server.com. Затем вам нужно связаться через JS со своей страницы на other-server.com и получить обратные вызовы, которые возвращают данные обратно на вашу страницу.

Возможно, но требует согласования с your-server.com и other-server.com

2 голосов
/ 06 марта 2014

Я знаю, что это старый вопрос, но я хотел поделиться своим подходом. Я использую cURL в качестве прокси, очень легко и последовательно. Создайте страницу php под названием submit.php и добавьте следующий код:

<?

function post($url, $data) {
$header = array("User-Agent: " . $_SERVER["HTTP_USER_AGENT"], "Content-Type: application/x-www-form-urlencoded");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}

$url = "your cross domain request here";
$data = $_SERVER["QUERY_STRING"];
echo(post($url, $data));

Тогда в вашем js (jQuery здесь):

$.ajax({
type: 'POST',
url: 'submit.php',
crossDomain: true,
data: '{"some":"json"}',
dataType: 'json',
success: function(responseData, textStatus, jqXHR) {
    var value = responseData.someKey;
},
error: function (responseData, textStatus, errorThrown) {
    alert('POST failed.');
}
});
2 голосов
/ 23 сентября 2010

Это старый вопрос, но некоторые новые технологии могут помочь кому-то.

Если у вас есть административный доступ к другому серверу, вы можете использовать проект Forge с открытым исходным кодом для выполнения вашего междоменного POST. Forge предоставляет междоменную оболочку JavaScript XmlHttpRequest, которая использует API-интерфейсы необработанных сокетов Flash. POST может даже быть сделан по TLS.

Причина, по которой вам нужен административный доступ к серверу, на который вы размещаете POST, заключается в том, что вы должны предоставить междоменную политику, разрешающую доступ из вашего домена.

http://github.com/digitalbazaar/forge

1 голос
/ 12 сентября 2018

Если у вас есть доступ к междоменному серверу и вы не хотите вносить какие-либо изменения в код на стороне сервера, вы можете использовать библиотеку под названием - 'xdomain'.

Как это работает:

Шаг 1: сервер 1: включите библиотеку xdomain и настройте междоменный домен в качестве ведомого:

<script src="js/xdomain.min.js" slave="https://crossdomain_server/proxy.html"></script>

Шаг 2: на междоменном сервере создайте файл proxy.html и включите сервер 1 в качестве главного:

proxy.html:
<!DOCTYPE HTML>
<script src="js/xdomain.min.js"></script>
<script>
  xdomain.masters({
    "https://server1" : '*'
  });
</script>

Шаг 3:

Теперь вы можете сделать AJAX-вызов proxy.html в качестве конечной точки с сервера server1. Это обход запроса CORS. Библиотека внутренне использует решение iframe, которое работает с учетными данными и всеми возможными методами: GET, POST и т. Д.

Запрос кода ajax:

$.ajax({
        url: 'https://crossdomain_server/proxy.html',
        type: "POST",
        data: JSON.stringify(_data),
        dataType: "json",
        contentType: "application/json; charset=utf-8"
    })
    .done(_success)
    .fail(_failed)
1 голос
/ 19 января 2017

CORS для вас. CORS - это «Обмен ресурсами между источниками», это способ отправки междоменного запроса. Теперь XMLHttpRequest2 и Fetch API поддерживают CORS и могут отправлять как POST, так и GET-запрос

Но у него есть свои пределы. Серверу необходимо конкретно запросить Access-Control-Allow-Origin , и его нельзя установить на '*'.

И если вы хотите, чтобы любой источник мог отправить вам запрос, вам нужен JSONP (также необходимо установить Access-Control-Allow-Origin , но может быть '*')

Для большого количества запросов, если вы не знаете, как сделать выбор, я думаю, вам нужен полнофункциональный компонент для этого. Позвольте мне представить простой компонент https://github.com/Joker-Jelly/catta


Если вы используете современный браузер (> IE9, Chrome, FF, Edge и т. Д.), Очень рекомендую использовать простой, но красивый компонент https://github.com/Joker-Jelly/catta.It без зависимости, менее 3 КБ, и он поддерживает Fetch, AJAX и JSONP с тем же синтаксисом и опциями смертельного образца.

catta('./data/simple.json').then(function (res) {
  console.log(res);
});

Он также поддерживает импорт в ваш проект, например, модуль ES6, CommonJS и даже <script> в HTML.

1 голос
/ 24 августа 2010

Должно быть возможно с пользовательской таблицей YQL + JS XHR, взгляните на: http://developer.yahoo.com/yql/guide/index.html

Я использую его, чтобы выполнить очистку HTML-кода на стороне клиента (js), работает нормально (У меня есть полный аудиоплеер, с поиском по интернету / плейлистам / текстам песен / последней информации о FM, все клиенты js + YQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...