Как отправить POST запрос и сделать редирект на УРЛ с помощью fsockopen

Тема в разделе "PHP", создана пользователем verfaa, 29 мар 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Мне нужно отправить на определенный скрипт POST запрос и затем перейти на этот адрес, чтобы был виден результат POST запроса.

    С помощью кода ниже я отправляю POST запрос на url. А как сделать чтобы при переходе на файл с этим кодом на заданный url осуществлялся POST-запрос и переход на этот урл? Помогите пожалуйста

    Код:
    // Отправляем POST запрос с помощью fsockopen()
     
    //открываем сокет к http://www.example.loc на 80-й порт с таймаутом в 30 секунд
    $socket = fsockopen($url, 80, $errno, $errstr, 30);
     
    //если fsockopen вернула false, то завершаем работу скрипта и выводим текст и номер ошибки
    if(!$socket)die("$errstr($errno)");
     
    //собираем данные
    $data = "purse=".urlencode($purse)."&order_id=".urlencode($order_id)."&amount=".urlencode($amount)."&amount=".urlencode($amount)."&description=".urlencode($description)."&sign=".urlencode($sign);
     
    //пишем в сокет метод, URI и протокол
    fwrite($socket, "POST ".$uri." HTTP/1.1\r\n");
    //а также имя хоста
    fwrite($socket, "Host: ".$url."\r\n");
     
    //теперь отправляем заголовки
    //Content-type должен быть applicaion/x-www-form-urlencoded
    fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
    //размер передаваемых данных передаем в заголовке Content-length
    fwrite($socket,"Content-length:".strlen($data)."\r\n");
    //типы принимаемых данных. */* означает, что принимаем все типы данных
    fwrite($socket,"Accept:*/*\r\n");
    //представимся оперой
    fwrite($socket,"User-agent:Opera 10.00\r\n");
    fwrite($socket,"Connection:Close\r\n");
    fwrite($socket,"\r\n");
     
    //теперь передаем данные
    fwrite($socket,"$data\r\n");
    fwrite($socket,"\r\n");
     
    //читаем и выводим ответ (ВМЕСТО этого нужно перейти на $url)
    /*
    $answer = '';
    while(!feof($socket)){
      $answer.= fgets($socket, 4096);
    }
    echo $answer;
     
    */
     
     
    //закрываем сокет
    fclose($socket);
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.451
    Симпатии:
    1.244
    С точки зрения протокола http, кто пост запрос отправил, тот и только тот может ответ читать.
    Если надо редиректнуть на страницу принимающую данные методом POST используют браузерные выкрутасы - скрытая для отображения форма с заполненными полями, и вызов функции submit для этой кнопки, через javascript.
     
    verfaa нравится это.
  3. plasmo

    plasmo Писатель

    Регистр.:
    10 фев 2012
    Сообщения:
    2
    Симпатии:
    0
    не понятен смысл , для чего , ответ сервера это и есть "переход "
     
  4. gothmog

    gothmog Постоялец

    Регистр.:
    18 июн 2011
    Сообщения:
    60
    Симпатии:
    24
    PHP:
    header("Location: тут нужный урл");
    Даст редирект на урл, но результат пост запроса не будет виден. Чтобы получить в браузере именно результат - нужно читать ответ (из сокета) и выводить его в браузер (recv && echo).
    Хотя, честно говоря, не до конца ясно, что вообще надо.
     
  5. OctoRostov

    OctoRostov Писатель

    Регистр.:
    17 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Постом не получится, можно гетом, что-то типа "header( 'Location: /people/user.php?param=0', true, 307 );"
     
  6. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Я сделал просто
    Код:
    echo "<form name=\"sms\" action='".$url."' method='POST'>";
    echo "<input name='id' type='hidden' value='".$id."' />";
    echo "<input name=\"description\" type=\"hidden\" value='".$description."' />";
    echo "<input name=\"purse\" type=\"hidden\" value='".$purse."' />";
    echo "<input name=\"order_id\" type=\"hidden\" value='".$order_id."' />";
    echo "<input name=\"amount\" type=\"hidden\" value='".$amount."' />";
    echo "<input name=\"clear_amount\" type=\"hidden\" value='".$clear_amount."' />";
    echo "<input name=\"sign\" type=\"hidden\" value='".$sign."' />";
    echo "</form>";
     
    echo "<script type=\"text/javascript\">";
    echo "window.onload = function() {";
    echo "document.forms[\"sms\"].submit();";
    echo "} </script>";
    
    и работает как надо, всем спасибо.
     
  7. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    появился ещё один вопрос: Как отправить массив в форму через скрытое поле?

    Нужно массив вида
    Код:
    Array ( [name] => landing_test [ids] => Array ( [0] => 2 [1] => 5 )  [site_lang] => 1 )
    
    отправить, используя форму. Делаю так:
    Код:
    echo "<form name=\"love\" action='/subm.php' method='POST'>";
    echo "<input type=\"hidden\" name=\"name\" value='".$data["fname"]."' />";
    echo "<input type=\"hidden\" name=\"ids[]\" value='".$data["ids"]."'>";
    echo "<input type=\"hidden\" name=\"site_lang\" value='".$data["site_lang"]."'>";
    echo "</form>";
     
    echo "<script type=\"text/javascript\">";
    echo "window.onload = function() {";
    echo "document.forms[\"love\"].submit();";
    echo "} </script>";
    
    В результате, в скрипте subm.php, сделав print_r($_POST); получаю:
    Код:
    Array ( [name] => landing_test [ids] => Array ( [0] => Array ) [site_lang] => 1 )
    
    т.е. ids приходит пустой, без элементов. Как привильно отправить массив, чтобы ids пришел с элементами?
     
  8. ne4to

    ne4to Постоялец

    Регистр.:
    16 ноя 2012
    Сообщения:
    107
    Симпатии:
    50
    Код:
    value='".json_encode($data["ids"])."'
    
     
  9. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.451
    Симпатии:
    1.244
    В формате необходимом ТС, скорее так:

    PHP:
    foreach($data["ids"] as $val){
        echo 
    "<input type=\"hidden\" name=\"ids[]\" value='".$val."'>";
    }
    Хотя json_encode(), json_decode(), я бы тоже назвал более предпочтительным вариантом.
     
    verfaa нравится это.
Статус темы:
Закрыта.