Кроссдоменный ajax запрос методом POST [ Cross domain Ajax POST query]

Сразу скажу, что использовать будем curl.
Суть проста: Отправляем данные на локальный скрипт, который принимает переменную и с помощью curl отправляет их на другой сервер. Получает ответ и выдает его в локальный скрипт.

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
            <script type="text/javascript" src="jquery.js"></script>
                <script type="text/javascript">
                var ajax_url = 'http://newdomain.com/ajax.php';
                $(document).ready(function(){
                    $('#link').click(function(){

                        $.post
                        (
                        "proxy.php",
                        {
                            msg: 'wer',
                            target_id: 'sdf'
                        },
                        function(data) {
                          alert(data);
                        });
                    });
                });
            </script>

    </head>
    <body>
        <a href="#" id="link">post cross domain query</a>
    </body>
</html>

Локальный файл, так называемый proxy.php

<?

$url = $_POST['url'];
unset($_POST['url']);

$fields_string = "";

foreach ($_POST as $key => $value)
{
    $fields_string .= $key . '=' . $value . '&';
}
rtrim($fields_string, '&');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($_POST));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

$result = curl_exec($ch);

curl_close($ch);
?>

Ну и файл на удаленном сервере ajax.php

<?php

error_reporting(0);

header("Content-type: text/plain; charset=utf-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Connection: close");
//print_r($_POST);
if (!count($_POST))
    die('ERR');
$data = array ();
foreach ($_POST as $k => $v)
    $data[] = $k . '=' . $v;
echo implode('&', $data) . "\nHI from " . $_SERVER['SERVER_NAME'] . '!';
exit;
?>

http://vazelin.org.ua/wp-content/plugins/downloads-manager/img/icons/winrar.gif download: ajax-cross-domain (16.60KB)
added: 16/02/2012
clicks: 35
description:

$.postJSON() или как обойтись без $.getJSON()

Кто использует $.getJSON() знает, что переменные передаются методом GET, а это есть не хорошо.
Предлагаю решение, которое отправляет данные JSON методом POST:

$.postJSON = function(url, data, callback) {
$.post(url, data, callback, "json");
};

AJAX и «кириллические символы»

Столкнулся с проблемой, есть скрипт, который добавляет с помощью формы запись в таблицу используя AJAX. Так вот, во всех браузерах, кроме IE кириллические символы добавляются без проблем, а вот ИЕ «глючит» с кодировкой.
Решение нашлось простое — использование функции

1
encodeURI()

Теперь, пред тем, как мы отправляем переменную исполняющему файлу, мы просто кодируем кириллицу

1
2
3
4
5
6
7
8
9
10
11
...............................
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
  {
  alert ("Browser does not support HTTP Request");
  return;
  }
var url="ins.php";
str=encodeURI(str);
url=url+"?q="+str;
.........