Дополнительно
Как отправить междоменный POST-запрос с помощью JavaScript?
Как отправить междоменный POST-запрос с помощью JavaScript?
Примечания - он не должен обновлять страницу, и мне нужно получить и разобрать ответ после этого.
553
17
Обновление: Прежде чем продолжить, каждый должен прочитать и понять html5rocks учебник на CORS. Это легко понять и очень ясно.
Если вы управляете POST-сервером, просто используйте «Стандарт межпроходного обмена ресурсами», установив заголовки ответов на сервере. Этот ответ обсуждается в других ответах в этой теме, но, на мой взгляд, не очень четко.
Короче говоря, вот как вы выполняете кросс-домен POST от from.com/1.html до to.com/postHere.php (используя PHP в качестве примера). Примечание: вам нужно только установить
Access-Control-Allow-Origin
для запросов NONOPTIONS
- этот пример всегда устанавливает все заголовки для меньшего фрагмента кода.В postHere.php настройка следующая:
Это позволяет вашему сценарию создавать кросс-домен POST, GET и OPTIONS. Это станет ясно, когда вы продолжите читать...
Настройте свой кросс-домен POST из JS (пример jQuery):
Когда вы делаете POST на шаге 2, ваш браузер отправляет на сервер метод «ОПЦИИ». Это «нюхание» со стороны браузера, чтобы увидеть, не крут ли сервер с вами. Сервер отвечает «Access-Control-Allow-Origin», сообщая браузеру, что он в порядке с POST | GET | ORIGIN, если запрос возник из «http://from.com» или «https://from.com». Поскольку с сервером все в порядке, браузер сделает второй запрос (на этот раз POST). Хорошей практикой является то, что ваш клиент устанавливает тип отправляемого контента, поэтому вам также необходимо это разрешить.
MDN имеет отличную рецензию о HTTP-контроле доступа, в которой подробно рассказывается о том, как работает весь поток. Согласно их документам, он должен «работать в браузерах, которые поддерживают межсайтовый XMLHttpRequest». Это немного вводит в заблуждение, так как я ДУМАЮ , что только современные браузеры разрешают POST с междоменным доменом. Я только проверил, что это работает с safari, chrome, FF 3.6.
Имейте в виду следующее, если вы делаете это:
Если вы управляете удаленным сервером, вам, вероятно, следует использовать 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 и вам необходимо использовать файлы cookie), существуют способы обойти политику одного и того же происхождения, например, с помощью
window.postMessage
и / или одного из ряда библиотеки, позволяющие отправлять межкадровые сообщения в старых браузерах:Если вы не управляете удаленным сервером, вы не можете прочитать ответ POST, точка. В противном случае это вызовет проблемы с безопасностью.
Псевдокод
Вероятно, вы хотите стилизовать iframe, чтобы он был скрыт и абсолютно позиционирован. Не уверен, что браузер разрешит межсайтовый постинг, но если да, то вот как это сделать.
Сохраняйте это простым:
кросс-домен POST:
используйте
crossDomain: true,
не должен обновлять страницу:
Нет, он не будет обновлять страницу, так как обратный вызов
success
илиerror
будет вызываться при отправке ответа сервером. & Лт; hr >Пример сценария:
Если у вас есть доступ ко всем задействованным серверам, поместите в заголовок ответа следующее для запрашиваемой страницы в другом домене:
PHP:
Например, в коде drupal xmlrpc.php вы должны сделать это:
Это, вероятно, создает проблему безопасности, и вы должны убедиться, что вы принимаете соответствующие меры для проверки запроса.
Проверьте функцию
post_method
в http://taiyolab.com/mbtweet/scripts/twitterapi_call.js - это хороший пример для метода iframe, описанного выше.Создайте две скрытые iframes (добавьте «отображение: нет;» в стиле css). Сделайте свой второй iframe точкой на что-то в вашем собственном домене.
Создайте скрытую форму, установите для ее метода значение «post» с целью = вашей первой iframe, и, при необходимости, установите для enctype значение «multipart / form-data» (я думаю, что вы хотите сделать POST, потому что вы хотите отправлять многочастные данные, такие как изображения ,?)
Когда будете готовы, сделайте форму submit () POST .
Если вы можете заставить другой домен вернуть javascript, который будет осуществлять междоменную связь с Iframes (http://softwareas.com/cross-domain-communication-with-iframes), тогда вам повезло, и вы можете получить ответ также.
Конечно, если вы хотите использовать свой сервер в качестве прокси-сервера, вы можете избежать всего этого. Просто отправьте форму на свой собственный сервер, который будет передавать запрос на другой сервер (при условии, что другой сервер не настроен для уведомления о расхождениях в IP), получите ответ и верните все, что вам нравится.
Еще одна важная вещь, чтобы отметить!!! В пример выше описано, как использовать
JQuery 1.6 и ниже имеет ошибку с кросс-доменом XHR . Согласно Firebug, никаких запросов, кроме OPTIONS, не было отправлено. Нет поста. Совсем.
Потратил 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» следующим образом:
Я думаю, что лучший способ - использовать XMLHttpRequest (например,. $ .ajax (), $ .post () в jQuery) с одним из полифилов межотраслевого обмена ресурсами https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#wiki-CORS
Высокий уровень.... Вам необходимо настроить cname на вашем сервере таким образом, чтобы other-serve.your-server.com указывал на other-server.com.
На вашей странице динамически создается невидимый iframe, который выступает в качестве транспорта на other-server.com. Затем необходимо передать данные с помощью JS с вашей страницы на other-server.com и сделать обратные вызовы, возвращающие данные обратно на вашу страницу.
Это возможно, но требует координации действий между вашим и другим сервером.
Есть еще один способ (используя функцию html5). Вы можете использовать прокси-ифрам, размещенный в этом другом домене, вы отправляете сообщение с помощью postMessage в этот iframe, затем этот iframe может выполнять запрос POST (в том же домене) и postMessage обратно с reposnse в родительское окно.
родитель на sender.com
iframe на reciver.com
Это старый вопрос, но некоторые новые технологии могут помочь кому-то.
Если у вас есть административный доступ к другому серверу, вы можете использовать проект Forge с открытым исходным кодом для выполнения вашего кросс-доменного POST. Forge предоставляет оболочку JavaScript XmlHttpRequest с кросс-доменом, которая использует преимущества API-интерфейса необработанных сокетов Flash. POST можно даже сделать через TLS .
Причина, по которой вам нужен административный доступ к серверу, на который вы размещаете, заключается в том, что вы должны предоставить политику междоменного доступа, которая разрешает доступ из вашего домена.
http://github.com/digitalbazaar/forge
Я знаю, что это старый вопрос, но я хотел поделиться своим подходом. Я использую cURL в качестве прокси, очень легко и последовательно. Создайте страницу php с именем submit.php и добавьте следующий код:
Затем в вашем js (jQuery здесь):
Если у вас есть доступ к серверу междоменных ресурсов и вы не хотите вносить какие-либо изменения в код на стороне сервера, вы можете использовать библиотеку с именем - «xdomain».
Как это работает:
Шаг 1: сервер 1: включите библиотеку xdomain и настройте кросс-домен как подчиненный:
Шаг 2: на сервере кросс-доменов создайте файл proxy.html и включите сервер 1 в качестве мастера:
Шаг 3:
Теперь вы можете сделать AJAX-вызов на proxy.html в качестве конечной точки с server1. Это обход запроса CORS. Внутренняя библиотека использует решение iframe, которое работает с учетными данными и всеми возможными методами: GET, POST и т. Д.
Запрос кода ajax:
Должно быть возможно с пользовательской таблицей YQL + JS XHR, взгляните на: http://developer.yahoo.com/yql/guide/index.html
Я использую его для очистки HTML-картинга на стороне клиента (js), работает нормально (У меня есть полный аудиоплеер, с поиском в Интернете / списках воспроизведения / текстах / последней информации fm, все клиенты js + YQL)
CORS для вас. CORS - это «Cross Origin Resource Sharing», способ отправки междоменного запроса. Теперь XMLHttpRequest2 и Fetch API поддерживают CORS и могут отправлять запросы POST и GET
Но у него есть свои пределы. Серверу необходимо указать Access-Control-Allow-Origin , и его нельзя установить на «*».
И если вы хотите, чтобы какой-либо источник мог отправить вам запрос, вам нужен JSONP (также необходимо установить Access-Control-Allow-Origin , но может быть '*')
Для большого количества запросов, если вы не знаете, как сделать выбор, я думаю, что для этого вам нужен полнофункциональный компонент. Позвольте мне представить простой компонент [https://github.com/Joker-Jelly/catta] ( https://github.com/Joker-Jelly/catta)
Если вы используете современный браузер (> IE9, Chrome, FF, Edge и т. Д.).), Очень рекомендую вам использовать простой, но косметический компонент https://github.com/Joker-Jelly/catta. Он не имеет зависимости Менее 3 КБ, и он поддерживает Fetch, AJAX и JSONP с тем же синтаксисом и опциями смертельной выборки.
Он также поддерживает весь способ импорта в ваш проект, такой как модуль ES6, CommonJS и даже
< script >
в HTML .