Задать вопрос
@lezhenkin

Как добавить HTTP заголовки к SOAP запросу?

Из PHP-сценария я отправляю SOAP-запрос. Помимо данных в теле запроса сервер ожидает от меня еще два HTTP-заголовка. Не могу понять, как правильно их ему отправить.

Что делаю я.

$oSoapClient = new SoapClient( $url, $aOptions );

$aHeaders = array();
$aHeaders[] = new SoapHeader( 'http://soapinterop.org/echoheader/', 'token', $token ); 
$aHeaders[] = new SoapHeader( 'http://soapinterop.org/echoheader/', 'user-token', $user_id ); 

$oSoapClient->__setSoapHeaders( $aHeaders );

$result = $oSoapClient->__doRequest( $sXml, $url, null, SOAP_1_1 );


И сервер возвращает ошибку с сообщением о том, что требуемые ему заголовки не найдены.
Из документации к SOAP на php.net ничего нового для себя не нашел.

Что я делаю не так?
  • Вопрос задан
  • 1456 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Vamp
@Vamp
__setSoapHeaders устанавливает заголовки soap запроса, а не http. Они размещаются в элементе Header. По вашему примеру кода получится что-то типа такого:
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="yourns"
    xmlns:ns2="http://soapinterop.org/echoheader/">
    <SOAP-ENV:Header>
        <ns2:token>token</ns2:token>
        <ns2:user-token>user_id</ns2:user-token>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <!-- тело запроса -->
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Для добавления именно http заголовков нужно создать stream context:
$aOptions['stream_context'] = stream_context_create([
    'http' => [
        'header' => "token: abc\r\nuser-token: 123"
    ]
]);

$oSoapClient = new SoapClient( $url, $aOptions );
$result = $oSoapClient->__doRequest( $sXml, $url, null, SOAP_1_1 );
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы