Отправка post запроса на чужой домен задача часто встречающаяся. Как оказалось работающего решения у нее нет. Есть лишь пара "костыльных" вариантов.
Первый, и самый работающий это jsonp. Однако jsonp - это GET запрос. Т.е. количество данных переданных за один запрос в разных ситуациях не может превышать 1024 байта, или другого значения. Зависит то ли от настроек браузера, то ли от настроек сервера.
Объясню, что такое jsonp. При jsonp запросе, в документе динамически создается элемент <script>, его атрибуту src присваивается url содержащий все данные, которые Вы хотите передать на сервер. Затем, элемент присоединяется к документу и в этот момент происходит запрос на сервер. В ответ, сервер может вернуть js код, который выполниться после загрузки. Обычно в одним из параметров в src скрипта подают еще название callback функции, которую нужно будет вызвать. Рассмотрим подробнее
Вот js код отправки данных
var callback_me = function( data ){ alert(data.id+'загружен'); } var script = document.createElement('script'); // создаем элемент script.src = 'http://xdan.ru/data.php?callback=callback_me&id=123&name=masha&famaly='+encodeURIComponent('Петровна'); document.body.appendChild( script ); // добавляем элемент в документ, в этот момент и происходит запрос
и php код на сервере
<?php $id = $_GET['id']; $name = $_GET['name']; // но обычно использую $_REQUEST, чтобы иметь совместимость с обычным post запросом $famaly = $_REQUEST'famaly']; $callback = $_REQUEST'callback']; echo $callback.'('.json_encode(array('id'=>$id)).')'; exit();
в результате в script загружается такой код
callback_me({id:123});
в результате вызывается необходимая функция, в которой можно произвести какие-то манипуляции с пришедшими данными.
Вот и все. Но, как я уже написал выше это GET запрос, что бы Вам не говорили. Даже модный jquery.getJSON тоже работает на GET запросе.
Остаются еще пару вариантов: делать все через flash и использовать iframe с формой. Оба костыльные. Как я и предупреждал отправка post запроса на другой домен задача не тривиальная. Проще разработать свой сайт
Для варианта с flash есть немало заморочек. Я его не пробовал, просто потому, что флеш невзлюбил еще на заре его появления. Теперь по мере развития html5 это нелюбовь только усиливается. Однако, как пишут на форумах, вариант рабочий. Чтобы он сработал. и флеш мог отправлять данные необходимо чтобы на Вашем (другом) сервере лежал файл crossdomain.xml с таким содержанием
<?xml version="1.0" ?> <cross-domain-policy> <allow-access-from domain="*.domain1.ru" /> </cross-domain-policy>
Способ с iframe весьма хорош. Отправлять можно все что угодно, можно отправлять даже файлы, но у него есть один минус. Он не вызывает callback функцию. Т.е. нельзя узнать отправились ли данные и что вернул сервер. Так как это единственный верный способ отправлять большие объемы данных, то я воспользовался именно им. А чтобы узнать все ли хорошо с данными, которые Вы отправили можно после такого запроса отправить классический jsonp с неким параметром, к примеру id и в ответ сервер вернет данные по запросу с этим id. Понятно, что iframe запрос тоже нужно слать с этим же id. Подробнее расскажу в комментариях, если кого заинтересовало.
Немного разбавлю теорию куском кода, чтобы было понятно, как работать с iframe
function iploader( url,data ){ var frame = document.createElement('iframe'); //frame.style.display = 'none'; document.body.appendChild(frame); var doc = frame.contentDocument || frame.contentWindow.document; doc.open(); var s = ''; for( var c in data ){ s+='<input type="hidden" name="'+c+'" value="'+ (data[c]+'') .replace(/&/g, '&').replace(/"/g, '"') .replace(/'/g, ''') .replace(/</g, '<') .replace(/>/g, '>')+ '"/>'; } doc.write( '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><form accept-charset=UTF-8 enctype="application/x-www-form-urlencoded" id="ex_form" action="'+url+'" method="post">'+s+'</form></body></html>' ); doc.close(); doc.getElementById('ex_form').submit(); } iploader('http://xdan.ru/con.php',{id:23455,asaa:342423,sdfsd:456456,rtrt:'zxxcz zxczx " czxczxc zx zxczxczxczx czxczxc'});
Комментарии