Как отправить междоменный запрос POST через JavaScript?
Примечания - это не должно обновлять страницу, и мне нужно получить и проанализировать ответ впоследствии.
javascript
ajax
cross-domain
Идо Шахам
источник
источник
Ответы:
Обновление: Прежде чем продолжить, каждый должен прочитать и понять учебник html5rocks по CORS. Это легко понять и очень ясно.
Если вы управляете сервером POST, просто используйте «Стандарт общего доступа к ресурсам», установив заголовки ответов на сервере. Этот ответ обсуждается в других ответах в этой теме, но не очень ясно, на мой взгляд.
Вкратце, вот как вы выполняете междоменный POST от from.com/1.html до to.com/postHere.php (используя PHP в качестве примера). Примечание: вам нужно только установить
Access-Control-Allow-Origin
дляOPTIONS
запросов NON - этот пример всегда устанавливает все заголовки для меньшего фрагмента кода.В postHere.php настройка следующая:
Это позволяет вашему скрипту создавать междоменные POST, GET и OPTIONS. Это станет ясно, когда вы продолжите читать ...
Настройте свой междоменный POST из JS (пример jQuery):
Когда вы выполните POST на шаге 2, ваш браузер отправит серверу метод «OPTIONS». Это «фыркание» браузером, чтобы увидеть, крут ли сервер, когда вы размещаете на нем сообщение. Сервер отвечает «Access-Control-Allow-Origin», сообщая браузеру, что он в порядке, чтобы POST | GET | ORIGIN, если запрос возник из « http://from.com » или « https://from.com ». Поскольку с сервером все в порядке, браузер сделает второй запрос (на этот раз POST). Рекомендуется, чтобы ваш клиент устанавливал тип контента, который он отправляет, так что вам также нужно это разрешить.
У MDN есть отличная статья о контроле доступа HTTP , которая подробно описывает работу всего потока. Согласно их документам, он должен «работать в браузерах, которые поддерживают межсайтовый XMLHttpRequest». Это немного вводит в заблуждение, так как я думаю, что только современные браузеры допускают междоменный POST. Я только подтвердил, что это работает с сафари, хромом, FF 3.6.
Имейте в виду следующее, если вы делаете это:
источник
400 Bad Request
поOPTIONS
запросу. и воfirefox
втором запросеPOST
никогда не делается. :(Если вы управляете удаленным сервером, вам, вероятно, следует использовать CORS, как описано в этом ответе ; он поддерживается в IE8 и более поздних версиях, а также во всех последних версиях FF, GC и Safari. (Но в IE8 и 9 CORS не позволит вам отправлять куки в запросе.)
Так что, если вы не управляете удаленным сервером, или если вам нужно поддерживать IE7, или если вам нужны файлы cookie, и вы должны поддерживать IE8 / 9, вы, вероятно, захотите использовать технику iframe.
Вот пример кода; Я проверил это на IE6, IE7, IE8, IE9, FF4, GC11, S5.
Осторожно! Вы не сможете напрямую прочитать ответ POST, так как iframe существует в отдельном домене. Кадры не могут общаться друг с другом из разных доменов; это политика того же происхождения .
Если вы управляете удаленным сервером, но не можете использовать CORS (например, потому что вы используете IE8 / IE9 и вам необходимо использовать куки), есть способы обойти политику одного и того же происхождения, например, с помощью
window.postMessage
и / или одна из нескольких библиотек, позволяющая отправлять междоменные кросс-фреймовые сообщения в старых браузерах:Если вы не управляете удаленным сервером, вы не можете прочитать ответ POST, точка. В противном случае это вызовет проблемы с безопасностью.
источник
ПСЕВДОКОД
Вы, вероятно, хотите, чтобы стиль iframe был скрыт и абсолютно позиционирован. Не уверен, что браузер разрешит публикацию на нескольких сайтах, но если это так, то как это сделать.
источник
Будь проще:
междоменный пост:
использование
crossDomain: true,
Не следует обновлять страницу:
Нет, она не обновляет страницу, посколькуобратный вызов
success
илиerror
асинхронный вызов будет вызван, когда сервер отправит ответ.Пример скрипта:
источник
crossDomain: true
странно, не имеет абсолютно никакого отношения к реальным междоменным запросам. Если запрос междоменный, jquery автоматически устанавливает значение true.Если у вас есть доступ ко всем задействованным серверам, укажите в заголовке ответа следующую страницу для запрашиваемой страницы в другом домене:
PHP:
Например, в коде Drupal xmlrpc.php вы должны сделать это:
Это, вероятно, создает проблему безопасности, и вы должны убедиться, что вы принимаете соответствующие меры для проверки запроса.
источник
Проверьте
post_method
функцию в http://taiyolab.com/mbtweet/scripts/twitterapi_call.js - хороший пример для метода iframe, описанного выше.источник
Создайте два скрытых фрейма (добавьте «display: none;» в стиль css). Сделайте так, чтобы ваш второй iframe указывал на что-то в вашем домене.
Создайте скрытую форму, установите для ее метода «post» с target = вашим первым iframe и, при желании, установите для enctype «multipart / form-data» (я думаю, вы хотите сделать POST, потому что вы хотите отправлять многокомпонентные данные, такие как изображения ?)
Когда все будет готово, сделайте форму submit () POST.
Если вы можете заставить другой домен возвращать javascript, который будет выполнять междоменную связь с Iframes ( http://softwareas.com/cross-domain-communication-with-iframes ), то вам повезло, и вы можете получить ответ также.
Конечно, если вы хотите использовать свой сервер в качестве прокси, вы можете избежать всего этого. Просто отправьте форму на свой собственный сервер, который перенаправит запрос на другой сервер (при условии, что другой сервер не настроен на обнаружение несоответствия IP-адресов), получите ответ и верните все, что захотите.
источник
Еще одна важная вещь, чтобы отметить !!! В приведенном выше примере описано, как использовать
JQuery 1.6 и ниже имеет ошибку с междоменным XHR. Согласно Firebug, никаких запросов, кроме ВАРИАНТОВ, не было отправлено. Нет пост. Совсем.
Потратил 5 часов на тестирование / настройку моего кода. Добавление большого количества заголовков на удаленный сервер (скрипт). Без какого-либо эффекта. Но позже я обновил JQuery lib до версии 1.6.4, и все работает как шарм.
источник
Если вы хотите сделать это в среде ASP.net MVC с JQuery AJAX, выполните следующие действия: (это краткое изложение решения, предлагаемого в этой теме)
Предположим, что «caller.com» (может быть любой веб-сайт) необходимо опубликовать на «server.com» (приложение ASP.net MVC)
В файле «server.com» приложения Web.config добавьте следующий раздел:
На «server.com» у нас будет следующее действие на контроллере (называемом «Home»), на котором мы будем публиковать сообщения:
Затем из «caller.com» отправьте данные из формы (с html id «formId») на «server.com» следующим образом:
источник
Есть еще один способ (использование функции html5). Вы можете использовать прокси-сервер iframe, размещенный в этом другом домене, вы отправляете сообщение с помощью postMessage этому iframe, затем этот iframe может выполнить запрос POST (в том же домене) и postMessage обратно с reposnse в родительское окно.
родитель на sender.com
iframe на reciver.com
источник
Высокий уровень .... Вам нужно настроить cname на своем сервере, чтобы other-serve.your-server.com указывал на other-server.com.
Ваша страница динамически создает невидимый iframe, который служит вашим транспортом на other-server.com. Затем вам нужно связаться через JS со своей страницы на other-server.com и получить обратные вызовы, которые возвращают данные обратно на вашу страницу.
Возможно, но требует координации от your-server.com и other-server.com
источник
Я думаю, что лучший способ - это использовать XMLHttpRequest (например, $ .ajax (), $ .post () в jQuery) с одним из полифайлов перекрестного общего доступа к ресурсам https://github.com/Modernizr/Modernizr/wiki/HTML5- Cross-Browser-Polyfills # вики-CORS
источник
Это старый вопрос, но некоторые новые технологии могут помочь кому-то.
Если у вас есть административный доступ к другому серверу, вы можете использовать проект Forge с открытым исходным кодом для выполнения вашего междоменного POST. Forge предоставляет междоменную оболочку JavaScript XmlHttpRequest, которая использует API-интерфейсы необработанных сокетов Flash. POST может даже быть сделан по TLS.
Причина, по которой вам нужен административный доступ к серверу, на который вы размещаете POST, заключается в том, что вы должны предоставить междоменную политику, которая разрешает доступ из вашего домена.
http://github.com/digitalbazaar/forge
источник
Я знаю, что это старый вопрос, но я хотел поделиться своим подходом. Я использую cURL в качестве прокси, очень легко и последовательно. Создайте страницу php под названием submit.php и добавьте следующий код:
Затем в вашем JS (JQuery здесь):
источник
Должно быть возможно с пользовательской таблицей YQL + JS XHR, взгляните на: http://developer.yahoo.com/yql/guide/index.html
Я использую его, чтобы выполнить некоторые операции очистки jtml на стороне клиента (js), работает отлично (у меня есть полноценный аудиоплеер, с поиском в интернете / плейлистов / текстов песен / последней информации fm, все клиенты js + YQL)
источник
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 . У него нет зависимости, меньше чем 3 КБ, и он поддерживает Fetch, AJAX и JSONP с тем же синтаксисом и опциями смертельного образца.
Он также поддерживает импорт в ваш проект, такой как модуль ES6, CommonJS и даже
<script>
в HTML.источник
Если у вас есть доступ к междоменному серверу и вы не хотите вносить какие-либо изменения в код на стороне сервера, вы можете использовать библиотеку под названием - 'xdomain'.
Как это работает:
Шаг 1: сервер 1: включите библиотеку xdomain и настройте междоменный домен в качестве ведомого:
Шаг 2: на междоменном сервере создайте файл proxy.html и включите сервер 1 в качестве главного:
Шаг 3:
Теперь вы можете сделать AJAX-вызов proxy.html в качестве конечной точки с сервера server1. Это обход запроса CORS. Библиотека внутренне использует решение iframe, которое работает с учетными данными и всеми возможными методами: GET, POST и т. Д.
Запросите код AJAX:
источник