Как отправить форму на страницу на другом сервере с некоторым типом AJAX? - PullRequest
1 голос
/ 08 августа 2011

Я хотел бы отправить свою форму на другую страницу, но запретить переход на эту страницу (например, AJAX, но я знаю, что AJAX не работает в разных доменах)

Ребята, вы знаете, как это сделать? Мне не нравится размещать его на странице на другом сайте, потому что это действительно более медленный и более хрупкий способ сделать что-либо.

Спасибо
Натан Джонсон

Ответы [ 3 ]

5 голосов
/ 08 августа 2011

Отправьте форму на локальную страницу через AJAX.С этой страницы вы можете опубликовать данные на удаленном сайте, например, cURL.

Вот очень абстрактный пример:

page_with_form.php

<form id="form1">
//input fields
</form>

<script>
$.post('post_to_remote.php', $('#form1').serialize(), function(){
   //do something when finished
   return false; //prevent from reloading 
});
</script>

post_to_remote.php

  $param1 = $_POST['param1'];
  $param2 = $_POST['param2'];

  $remoteUrl = 'http://www.remote_site.com/page_to_post_to.php';
  $postFields = array('param1' => $param1, 'param2' => $param2);
  //if you don't want to do any sanitizing, you can also simply do this:
  //$postFields = $_POST;

  $data_from_remote_page = $getUrl($remoteUrl, 'post', $postFileds);

  function getUrl($url, $method='', $vars='') {
    $ch = curl_init();
    if ($method == 'post') {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    $buffer = curl_exec($ch);
    curl_close($ch);
    return $buffer;
  }

Если вам не нужна полная мощность скручивания, и это действительно просто сообщение, вы также можете использовать встроенные функции PHP:

$postFields = http_build_query($_POST);
$remoteUrl = 'http://www.remote_site.com/page_to_post_to.php';

$context = stream_context_create(
          array(
            'http' => array(
              'method' => 'POST',
              'header' => "Content-type: application/x-www-form-urlencoded\r\n",
              'content' => $postFields,
              'timeout' => 10,
            ),
          )
);

$result = file_get_contents($remoteURL, false, $context);

Другой базовый пример, но вы поняли.

3 голосов
/ 08 августа 2011

Вы можете попробовать использовать JSONP:

http://davidwalsh.name/jsonp

http://api.jquery.com/jQuery.getJSON/#jsonp

Может использоваться междоменный, но данные вы отправляете обратнос сервера должно быть что-то вроде (PHP):

echo $_GET['callback']."(".json_encode($data).")";

Когда я впервые использовал его, я не повторил имя функции обратного вызова, и мне потребовалось несколько часов, чтобы понять, почему это не такработает.

Удачи!

0 голосов
/ 08 августа 2011

Попробуйте jsonp в javascript:

     $.ajax({
                        url: 'some_url' ,
                        data: $('#form_id').serialize(),
                        dataType: "jsonp",
                        jsonp : "callback",
                        jsonpCallback: "jsonpcallbask"
                    });

function jsonpcallbask(data) {
   //handle response here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...