Как обрабатывать API с сеансом (ответ XML 307) в PHP

У меня тут ситуация. В настоящее время я разработал сеть, и мне нужно сделать функцию для связи с API устройства. Теперь я застрял с 307 (временное перенаправление).

Итак, поток таков: сначала мне нужно сделать сеанс с функцией входа в систему. Если вход в систему выполнен успешно, он даст ответ 307 (временное перенаправление), и в заголовке ответа (sessionId) есть Location. Итак, чтобы отправить другой запрос, нам нужно следовать Location (sessionId). Когда я пытался в Postman, чтобы функция входа в систему всегда была успешной, чтобы получить местоположение (SessionId), но отправить другой запрос из этого местоположения, иногда это было успешно, а иногда и нет. Я пытался сделать это на PHP, для входа в систему всегда удавалось и получалось местоположение, но при отправке другого запроса он всегда терпел неудачу.

Вот функция XML для Login :

 POST / HTTP/1.1
 Host: 111.222.123.123:8001
 <soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:lgi = "http://www.qwerty.org/func/LGI">
     <soapenv:Header/>
     <soapenv:Body>
         <lgi:LGI>
             <lgi:OPNAME>username</lgi:OPNAME>
             <lgi:PWD>password</lgi:PWD>
         </lgi:LGI>
     </soapenv:Body>
 </soapenv:Envelope>

Это ответ заголовка от функции входа:

HTTP/1.1 307 Temporary Redirect
Location: http://111.222.123.123:8001/00112233
Server: Qwerty web server
Content-Type: text/xml; charset = "utf-8"
Content-Length: 411

00112233 — это Location (SessionId) для POST другого запроса. Но опять же, Если от Почтальона, иногда успех, а иногда и не успех. И если из PHP всегда не удавалось отправить запрос POST после получения местоположения (SessionId)

Вот мой PHP-скрипт для функции Авторизоваться:

    $soapUrl = "http://111.222.123.123:8001/";

    $xml_post_string1 = '<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:lgi = "http://www.qwerty.org/func/LGI">
                            <soapenv:Header/>
                            <soapenv:Body>
                                <lgi:LGI>
                                    <lgi:OPNAME>username</lgi:OPNAME>
                                    <lgi:PWD>password</lgi:PWD>
                                </lgi:LGI>
                            </soapenv:Body>
                        </soapenv:Envelope>';

    $headers1 = array(
                    "Content-type: text/xml;charset=\"utf-8\"",
                    "Accept: text/xml",
                    "Cache-Control: no-cache",
                    "Pragma: no-cache",
                    "SOAPAction: http://www.qwerty.org/func/LGI", 
                    "Content-length: ".strlen($xml_post_string1),
                );

        $url = $soapUrl;

        $ch1 = curl_init();
        curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch1, CURLOPT_URL, $url);
        curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch1, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
        curl_setopt($ch1, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch1, CURLOPT_POST, true);
        curl_setopt($ch1, CURLOPT_POSTFIELDS, $xml_post_string1);
        curl_setopt($ch1, CURLOPT_HTTPHEADER, $headers1);

        curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch1, CURLOPT_VERBOSE, 1);
        curl_setopt($ch1, CURLOPT_HEADER, 1);

        $response1 = curl_exec($ch1); 

        $header_size = curl_getinfo($ch1, CURLINFO_HEADER_SIZE);
        $header = substr($response1, 0, $header_size);

        $break1= explode('/', $header);
        $break2= preg_split('/[\s]+/', $break1[4]);
        $sessionId = $break2[0];

Это мой запрос после получения Location/SessionId:

    $soapUrlToken1 = "http://111.222.123.123:8001/";
    $soapUrlToken2 = $soapUrlToken1.$sessionId ;

    $xml_post_string2 = '<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:sh = "http://www.qwerty.org/func/SH_SUB">
                           <soapenv:Header/>
                           <soapenv:Body>
                              <sh:SH_SUB>
                                 <sh:USER>USERNAME</sh:USER>
                                 <sh:DETAIL>TRUE</sh:DETAIL>
                              </sh:SH_SUB>
                           </soapenv:Body>
                        </soapenv:Envelope>';

    $headers2 = array(
                    "POST /$token HTTP/1.1",
                    "Host: 111.222.123.123:8001",
                    "Content-type: text/xml;charset=\"utf-8\"",
                    "Accept: text/xml",
                    "Accept-Encoding: gzip,deflate",
                    "User-Agent: City Commons-HttpClient/3.1",
                    "SOAPAction: http://www.qwerty.org/func/SH_SUB",

                    "Content-length: ".strlen($xml_post_string2),
                );

    $urlToken = $soapUrlToken2;
    //echo "<br />".$urlToken."<br />";

    $ch2 = curl_init();
    curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch2, CURLOPT_URL, $urlToken);
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch2, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch2, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch2, CURLOPT_POST, true);
    curl_setopt($ch2, CURLOPT_POSTFIELDS, $xml_post_string2);
    curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers2);

    $response2 = curl_exec($ch2); 

    $response3 = str_replace("<SOAP-ENV:Body>","",$response2);
    $response4 = str_replace("</SOAP-ENV:Body>","",$response3);
    $parser2 = simplexml_load_string($response4);

В php ответ всегда о sessionId недействителен или истек. Я уже спросил у команды API, они объясняют только про Сеанс и порт должны поддерживаться, чтобы сделать еще один запрос после входа в систему.

Итак, какое лучшее решение для работы с 307 (временное перенаправление) в PHP?

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Уже нашел решение. Мне не нужно снова использовать curl_init() после получения Location (SessionId). curl_init() будет инициализирует новую сессию, это проблема, уже полученное ранее местоположение (sessionId) будет уничтожено с помощью curl_init()

Другие вопросы по теме