Создайте правильный заголовок SOAP-запроса (PHP) - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужно выполнить запросы к SOAP API с PHP и мне нужна следующая структура SOAP-заголовка:

<soapenv:Header>
    <ver:authentication>
        <pw>xxx</pw>
        <user>xxx</user>
    </ver:authentication>
</soapenv:Header>

Как мне создать этот заголовок?

Я пытался

$auth = [
    "ver:authentication" => [
        "pw" => $this->pw,
        "user" => $this->user
    ]
];

$options = [];
$options["trace"] = TRUE;
$options["cache_wsdl"] = WSDL_CACHE_NONE;
$options["compression"] = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP;

$client = new SoapClient("www.my-url.com/wsdl", $options);

$header = new SoapHeader("www.my-url.com", "authentication", $auth, false);
$client->__setSoapHeaders($header);

но это не работает. Ответом является «сбой», который я получаю, когда структура заголовка неверна ...

пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Я бы настоятельно советовал вам 2 вещи:

  • Используйте генератор WSDL to PHP для правильного построения вашего запроса. Кроме того, это облегчит вам обработку ответов. Тогда все использует ООП, что намного лучше. Взгляните на проект PackageGenerator .
  • Используйте проект WsSecurity , чтобы легко добавить свой выделенный SoapHeader, не задаваясь вопросом, как его сконструировать.
0 голосов
/ 10 сентября 2018

решение может быть объектно-ориентированным. В следующем коде приведен пример. Помните, что следующий код не является тестом.

class Authentication 
{
    protected $user;

    protected $pw;

    public function getUser() : ?string
    {
        return $this->user;
    }

    public function setUser(string $user) : Authentication
    {
        $this->user = $user;
        return $this;
    }

    public function getPw() : string
    {
        return $this->pw;
    }

    public function setPw(string $pw) : Authentication
    {
        $this->pw = $pw;
        return $this;
    }
}

Показанный выше класс является простой сущностью, которая содержит два свойства $user fpr имени пользователя и $pw для пароля. Кроме того, он содержит функции получения и установки для получения или установки значений для двух свойств.

Для следующего шага просто заполните класс данными и сохраните их в SoapVar объекте.

$authentication = (new Authentication())
    ->setUser('Username')
    ->setPw('YourEncodedPassword');

$soapEncodedObject = new \SoapVar(
    $authentication, 
    SOAP_ENC_OBJECT, 
    null, 
    null, 
    'authentication', 
    'http://www.example.com/namespace'
);

Как вы можете видеть выше, ваш класс аутентификации будет сохранен как объект soap var. Это закодировано как мыльный объект. Единственное, что вам нужно сделать, это установить пространство имен для этого объекта. В приведенном вами примере это ver:. С этим префиксом пространства имен где-то в вашем файле wsdl отмечается пространство имен. Вы должны найти этот URL-адрес пространства имен и просто заменить пример URL-адреса http://www.example.com/namespace на правильный URL-адрес, указанный в вашем wsdl.

Следующий шаг - установка этого заголовка в качестве мыла. Это довольно просто.

<code>try {
    $client = new SoapClient('http://www.example.com/?wsdl', [
        'trace' => true,
        'exception' => true,
        'cache_wsdl' => WSDL_CACHE_NONE,
        'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
    ]);

    // set the soap header
    $header = new SoapHeader('http://www.example.com/namespace', 'authentication', $authentication, false);
    $client->setSoapHeaders($header);

    // send the request
    $result = $client->someWsdlFunction($params);
} catch (SoapFault $e) {
    echo "<pre>";
    var_dump($e);
    echo "
"; if ($ client) { echo "
";
        var_dump($client->__getLastRequest());
        echo "
"; echo "
";
        var_dump($client->__getLastResponse());
        echo "
"; } }

Как вы можете видеть, это немного отличается от вашего примера. Вместо массива это объект аутентификации, закодированный в soap, который передается классу заголовка soap В целях сбоя вокруг мыльного клиента есть блок try / catch. В этом случае вы можете определить ошибку и, если клиент был инициирован правильно, вы также можете увидеть последний запрос и последний ответ в xml.

Надеюсь, я тебе помог. ;)

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