У меня тут ситуация. В настоящее время я разработал сеть, и мне нужно сделать функцию для связи с 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?
Спасибо






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