SOAP атрибутов на теле - PullRequest
       9

SOAP атрибутов на теле

0 голосов
/ 28 апреля 2020

Я должен использовать веб-сервис. Моя проблема в том, что в теге body есть атрибуты типа xmlns: wsu. Как я могу передать эти значения в тело?

Тело должно выглядеть как

<soap:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-1">
<!-- some stuff -->
</soap:Body>

Моя PHP функция

$soapClient = new SoapClient(
    'some.wsdl',
    array(
        'location' => 'url'
    )
);

$soapClient->myFunction($request);

1 Ответ

0 голосов
/ 29 апреля 2020

Добро пожаловать в стек переполнение Graccem,

упомянутые вами атрибуты являются пространствами имен. Они автоматически добавляются клиентом soap к вашему xml при отправке запроса. Другим возможным решением может быть использование метода __doRequest () клиента soap. В этом случае вам необходимо расширить клиентский класс soap.

declare(strict_types=1);
namespace Application\Soap;

class MySoapClient extends SoapClient
{
    public function __doRequest(string $request, string $location, string $action, int $version, int $one_way = 0): string
    {
        $doc = new DOMDocument();
        $doc->loadXML($request);

        $elements = $doc->getElementsByNameNS('http://schemas.xmlsoap.org/soap/envelope/', 'Body');
        if ($elements->length()) {
            $body = $elements->item(0);
            $body->setAttributeNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd', 'wsu:Id', 'id-1');
        }

        $request = $doc->saveXML();
        $this->__last_request = $request;

        return parent::__doRequest($request, $location, $action, $version, $one_way);
    }
}

Метод SoapClient::__doRequest() принимает полностью сформированный запрос xml в качестве первого параметра. Этот метод является последним шансом манипулировать xml перед отправкой.

Как его использовать ...

<code>try {
    $wsdl = 'some.wsdl';
    $options = [
        'exceptions' => true,
        'soap_version' => SOAP_1_1,
        'trace' => true,
    ];

    $data = []; // some data construct

    $client = new MySoapClient($wsdl, $options);
    $response = $client->doSomeAction($data);
} catch (SoapFault $fault) {
    $lastRequest = $lastResponse = '';
    if ($client instanceof SoapClient) {
        $lastRequest = $client->__getLastRequest();
        $lastResponse = $client->__getLastResponse();
    }
    echo "<pre>";
    var_dump($fault, $lastRequest, $lastResponse);
    echo "
";}

Мы используем здесь указывается trace, чтобы увидеть, что мы отправили и что мы получаем в качестве ответа в случае ошибки. Атрибут D ie wsu:Id теперь должен быть в вашем запросе xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...