Написать заголовки и отправить запрос SOAP - PHP

Serega1990

Новичок
Здравствуйте!
Новичок в php и первый раз столкнулся с SOAP. Облазил все что смог но не могу понять как правильно написать запрос сервису.
Есть на сервисе такие методы
[0] => RiverShipResponse getRiverRegistry(Ship $ship)
[1] => SeaShipResponse getSeaRegistry(Ship $ship)

Через SOAPUI увидел пример запроса:
<S:Envelope
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<S:Header>
<To xmlns="http://www.w3.org/2005/08/addressing">http://portal.ru/services/Services</To>
<Action xmlns="http://www.w3.org/2005/08/addressing">http://site.ru/Service/getRiverRegistryRequest</Action>
<ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
<Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo>
<FaultTo xmlns="http://www.w3.org/2005/08/addressing">
<Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</FaultTo>
<MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:4d9u6fdf-fac7-4054-
8d34-be10a90yua4d</MessageID>
<wsse:Security S:mustUnderstand="1">
<wsse:UsernameToken xmlns:ns14="http://docs.oasis-open.org/ws-sx/wssecure-conversation/200512" xmlns:ns13="http://www.w3.org/2003/05/soap-envelope"
wsu:Id="uuid_4s5c788e-hg85-654d-bb3a-c4658b1f90">
<wsse:Username>11111</wsse:Username>
<wsse:password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass</wsse:password>
</wsse:UsernameToken>
</wsse:Security>
</S:Header>
<S:Body>
<ns2:Ship xmlns:ns2="http://site.ru">
<!--<riverReg>xxx</riverReg>-->
</ns2:Ship>
</S:Body>
</S:Envelope>

Мой код:

$headers[] = new SoapHeader(" ",
" ",
' ');
$client->__setSoapHeaders($headers);
print_r($client->getRiverRegistry('11111', 'pass'));

При запуске без
$headers[] = new SoapHeader(" ",
" ",
' ');
$client->__setSoapHeaders($headers);

Выдает ошибку: Uncaught SoapFault exception: [wsa:MessageAddressingHeaderRequired] A required header representing a Message Addressing Property is not present in

В SOAPUI закоментировал строку:
<Action xmlns="http://www.w3.org/2005/08/addressing">http://site.ru/Service/getRiverRegistryRequest</Action>
получил ту же ошибку, но не могу понять как с ней работать в php

Пожалуйста, напишите что и как необходимо записать в заголовки, чтобы скрипт отработал. Заранее огромное спасибо!
 

WMix

герр M:)ller
Партнер клуба
Тебе не надо писать soap протокол. Вся задача сводится в передаче soap клиенту (твоему скрипту) url описания сервиса (wsdl) и простого вызова метода ( так будто у тебя этот метод уже существует)
 

Serega1990

Новичок
Тебе не надо писать soap протокол. Вся задача сводится в передаче soap клиенту (твоему скрипту) url описания сервиса (wsdl) и простого вызова метода ( так будто у тебя этот метод уже существует)
Если правильно Вас понял то этот код должен работать:
$client = new SoapClient("https://portal.site.ru/services/Service?wsdl", ['trace'=> true, 'exceptions' => true]);
$client->getMethod();
Но выдает ошибку об обязательном заголовке( A required header representing a Message Addressing Property is not present in).
Если понял не правильно пожалуйста напишите код
 

WMix

герр M:)ller
Партнер клуба
а понял проблему, прочти это и это
тебе необходимы эти строки
Код:
<To xmlns="http://www.w3.org/2005/08/addressing">http://portal.ru/services/Services</To>
<Action xmlns="http://www.w3.org/2005/08/addressing">http://site.ru/Service/getRiverRegistryRequest</Action>
<ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
  <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo>
<FaultTo xmlns="http://www.w3.org/2005/08/addressing">
  <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</FaultTo>
<MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:4d9u6fdf-fac7-4054-8d34-be10a90yua4d</MessageID>
 

Serega1990

Новичок
а понял проблему, прочти это и это
тебе необходимы эти строки
Код:
<To xmlns="http://www.w3.org/2005/08/addressing">http://portal.ru/services/Services</To>
<Action xmlns="http://www.w3.org/2005/08/addressing">http://site.ru/Service/getRegistryRequest</Action>
<ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
  <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo>
<FaultTo xmlns="http://www.w3.org/2005/08/addressing">
  <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</FaultTo>
<MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:4d9u6fdf-fac7-4054-8d34-be10a90yua4d</MessageID>
У меня проблема в написании кода. Вот что нацарапал:
$client = new SoapClient("https://portal.shipsea.ru/services/ShipService?wsdl", ['trace'=> true, 'exceptions' => true]);

$replyTo_arr = array('Address' => 'http://www.w3.org/2005/08/addressing/anonymous');
$faultTo_arr = array("Address" => "http://www.w3.org/2005/08/addressing/anonymous");
$security_arr = array('UsernameToken' => );

$headers = [];
$headers[] = new SoapHeader("http://www.w3.org/2005/08/addressing","To","http://portal.site.ru/services/Service");
$headers[] = new SoapHeader("http://www.w3.org/2005/08/addressing","Action","http://site.ru/IService/geRegistryRequest");
$headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing','ReplyTo', $replyTo_arr);
$headers[] = new SoapHeader("http://www.w3.org/2005/08/addressing","FaultTo",$faultTo_arr);
$headers[] = new SoapHeader("http://www.w3.org/2005/08/addressing","MessageID","uuid:4jhg45df-f3jk9-8843-8f14-be10a90kjhffgd3d");
$header[] = new SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Security","uuid:4jh7fdf-jklc9-487-8f14-be1kjkjgtr9ea8d");

$client->__setSoapHeaders($headers);

print_r($client->getRiverRegistry());

Дошел до Security и не знаю как правильно составить заголовок для него (неймспейсы для UsernameToken xmlns:ns14="http://docs.oasis-open.org/ws-sx/wssecure-conversation/200512" xmlns:ns13="http://www.w3.org/2003/05/soap-envelope" и так далее).
Если можете напишите как правильно оформить заголовок для элемента Security где находятся UsernameToken, Username, Password
 

Serega1990

Новичок
Сверху