Хобрук: Ваш путь к мастерству в программировании

Использование как отправки формы, так и перенаправления

В настоящее время у меня есть форма, которая отправляет данные партнеру с использованием метода GET. Проблема в том, что когда пользователь заполняет форму, он перенаправляется на тот же URL-адрес, на который переходит действие GET, это страница API со случайным кодом.

Мне нужно, чтобы пользователь, заполняющий форму, был перенаправлен на страницу благодарности, которую я размещаю, в то время как информация из формы все еще отправляется на эту партнерскую страницу API.

Я не могу манипулировать партнерской страницей API. Как мне это сделать? Я слышал разные ответы, включая POST, Iframe, ajax, onsubmit.

Может ли кто-нибудь подтвердить, какой метод будет работать лучше всего и почему?

14.08.2012

Ответы:


1

Изменить После обсуждения в чате мы пришли к выводу, что лучше размещать сообщения на стороне сервера. Вот пример реализации:

HTML:

<form id="my_form">
<!-- form elements -->
</form>
<div id="status_message"></div>

JavaScript:

$('#my_form').on('submit', function (e){
    $.ajax({
      type: "POST",
      url: "localProxy.php",
      data: $('#my_form').serialize(),
      success: function (response) {
         // do something!
      },
      error: function () {
         // handle error
      }
    });
});

PHP (localProxy.php)

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, 'http://thirdpartydomain.internet/login_url.php'); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $_POST);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
curl_close($ch);

// do something with the data on your end (if anything), or render the "thank you" page
die('<h1>Thanks!</h1>');

Исходный ответ

Есть пара подходов.

В первом случае вы упоминаете (через тег), что у вас есть jQuery — в этом случае вы можете использовать метод jquery ajax для отправки данных в API и для отправки их на свой собственный сервер. чтобы получить сообщение с благодарностью.

<form id="my_form">
<!-- form elements -->
</form>
<div id="status_message"></div>

... в вашей "готовой" функции:

var API_URL = 'http://www.some-api-provider.com/api.php';
var MY_URL = 'http://www.my-website.net/post_handler.php';
$('#my_form').on('submit', function (e){
    e.preventDefault();
    var error = false;

    // validation here, if there is an error, set error = true;

    if (error == true) {
        alert('There was a problem!'); // do something better than this!
        return false;
    }

    $.ajax({
      type: 'GET',
      url: API_URL,
      data: $('my_form').serialize(),
      success: function () {
        $.ajax({
          type: 'POST',
          url: MY_URL,
          data: $('#my_form').serialize(),
          success: function (response) {
            $('status_message').html(response);
          },
          error: function () {
            alert('There was a problem!'); // do something better than this!
          }
        });
      },
      error: function () {
        alert('There was a problem!'); // do something better than this!
      }
    });
    return false;
});

Что там происходит? Мы используем событие on для привязки прослушивателя событий к событию 'submit' формы. Когда пользователь нажимает кнопку «Отправить», этот код прослушивателя будет вызван.

Он, в свою очередь, сериализует данные вашей формы, а затем отправляет их API через GET. Пока это работает, он будет вызывать функцию успеха, которая, в свою очередь, отправит данные на ваш сервер через POST. Div status_message будет обновлен результатом, возвращаемым с вашего сервера.

Другой подход заключается в том, чтобы отправлять данные на ваш сервер в обычном режиме, а затем использовать cURL или какое-либо другое HTTP-соединение на стороне сервера для отправки данных в API. Я бы предпочел этот метод, так как он меньше зависит от javascript; если у вашего пользователя отключены сценарии, метод javascript завершится ошибкой.

Не зная, какую серверную технологию вы используете, я не мог бы привести ни одного примера, но если вы пойдете по этому пути и столкнетесь с проблемами, вы всегда можете задать другой вопрос!

Документация

14.08.2012
  • Рад, что помог! Я вижу, вы задали еще пару вопросов, не приняв ответа. Могу я предложить вам это сделать? Вы можете (и, вероятно, должны) вернуться и принять ответы на свой старый вопрос: meta.stackexchange.com/questions/5234/ 14.08.2012
  • еще один быстрый вопрос, если проверка формы (проверка Jquery) имеет ошибку, остановит ли она onsubmit или мне нужно будет реализовать это позже и задать совершенно новый вопрос об этом? 14.08.2012
  • @user1532944 user1532944 Строка e.preventDefault(); предотвратит отправку формы, как обычно. Итак, ниже этой строки, но выше ajax, вы можете выполнить некоторую проверку элементов формы. Если вы не хотите отправлять (т.е. есть ошибка), return false; выйдите из функции до вызова ajax, и вы остановите ее продолжение. 14.08.2012
  • @user1532944 user1532944 Я отредактировал пример кода, чтобы указать, где вы будете выполнять проверку. 14.08.2012
  • давайте продолжим это обсуждение в чате 14.08.2012

  • 2

    Используйте событие ajax и onSubmit для отправки данных в ваш API и перенаправления.

    $('form').onSubmit(function(){
     $.ajax({
      ... //your informations to send to the api
      success:function(){
        ...//your redirection to the success page
      }
     });
    });
    

    Дополнительная информация о ajax в jquery

    14.08.2012
  • Можете ли вы конкретно указать, что добавить в эти две области комментариев? мне нужно выполнить действие GET для xxxxxxx.com/xxx.ashx, и вся информация будет информация в форме с id=имя или id=телефон и т. д. затем перенаправить на window.location.href =thankyou.html; 14.08.2012

  • 3

    Использование jquery — хороший способ. Вот как бы я это сделал

    $("#formID").submit(function()
    {
        $.get('getUrl', { param1Name: param1Data, param2Name: param2Data (etc...) }, function(data)
        {
            document.location = "redirectURL";
        });
    
        return false;
    });
    
    14.08.2012

    4

    Лучше использовать Ajax и в случае успеха функции Ajax использовать перенаправление с помощью

    window.location.href = "thankyou.html";

    14.08.2012

    5

    Метод jquery ajax лучше всего подходит для этой цели, используйте их так:

    $.ajax({   
        type: "POST",   
        url: method path here,   
        data: jsonText,   
        contentType: "application/json; charset=utf-8",   
        dataType: "json",   
        success: function (response) {   
        if (response.d != '') {   
        //redirect code           
         }   
         },   
         failure: function (response) {   
         alert(response.d);   
         }
         });
    
    14.08.2012
    Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..