Создать запрос на авторизацию в PHP - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в SOAP и пытаюсь соединить его с PHP, но без положительных результатов.Может быть, вы можете дать мне руку

SOAP 1.2 Запрос

POST /XXXservice.asmx HTTP/1.1
Host: XXX.prueba.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetAcData xmlns="https://prueba.com/">
      <Userid>string</Userid>
      <Password>string</Password>
    </GetAcData>
  </soap12:Body>
</soap12:Envelope>

SOAP 1.2 Ответ

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetAcDataResponse xmlns="https://prueba.com/">
      <XX>xml</GetAcDataResult>
    </GetAcDataResponse>
  </soap12:Body>
</soap12:Envelope>

Iиспользовал следующий код, но я получаю это сообщение:

SOAP-ERROR: синтаксический анализ WSDL: невозможно загрузить из 'https://XXX.YYYY.com/XXXservice.asmx': преждевременное завершение данных в строке html тега 3

<?php
    $options = array(
            'Userid' => 'xx',
            'Password' => 'xx',
        );

        $client = new SoapClient("https://XXX.YYYY.com/XXXservice.asmx", $options);
        $result = $client('GetAcData');

?>

1 Ответ

0 голосов
/ 26 июня 2018

Прежде всего вам нужен URL-адрес конечной точки вашего веб-сервиса, который предоставляет вам содержимое wsdl.Как писал @camelsWrittenInCamelCase в своем комментарии, вы должны попробовать https://XXX.YYYY.com/XXXservice.asmx?wsdl вместо https://XXX.YYYY.com/XXXservice.asmx.

Далее вам следует обернуть все свои мыльные клиентские вещи в блок try / catch, чтобы получить все возможные исключения ибольшинство информации в случае ошибки.

<code>try {
    $client = new \SoapClient(
        'https://XXX.YYYY.com/XXXservice.asmx?wsdl',
        [
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'soap_version' => SOAP_1_2,
            'trace' => true,
        ]
    );
} catch (\SoapFault $fault) {
    echo "<pre>";
    var_dump($fault);
    echo "
"; echo"
";
    var_dump($client->__getLastRequest());
    echo "
"; echo"
";
    var_dump($client->__getLastResponse());
    echo "
";}

Как показано в примере выше, мыльный клиентинициализируется с массивом опций. Мы используем опцию трассировки, чтобы включить трассировку для получения последнего запроса на отправку и ответа. Кроме того, мы используем опцию исключения, чтобы заставить клиента генерировать исключения в случае любой ошибки. Более того, мы отключаем кэшированиеНастройки wsdl пока вы разрабатываете. Если вы собираетесь в производство, этот параметр должен быть установлен на WSDL_CACHE_DISK или WSDL_CACHE_MEMORY.

Теперь вам нужно знать, какие функции и типы (сложные типы)ваш веб-сервис предоставляет. Для этого вы можете сделать следующее.

<code>// getting the functions of your webservice
echo "<pre>";
var_dump( $client->__getFunctions() );
echo "
";// получение типов вашего веб-сервиса echo "
";
var_dump( $client->__getTypes() );
echo "
";

Поскольку я не знаю точную область действия вашего веб-сервиса, я просто предположу, что веб-сервис предоставляет метод с именем DetAcData с двумя параметрами Userid и Password.С этой информацией я могу только догадываться, как может выглядеть правильный звонок.Для получения подробной информации мне понадобятся выходные данные __getFunctions() и __getTypes().

Примерный вызов может выглядеть следующим образом.

<code>try {
    $client = new \SoapClient(
        'https://XXX.YYYY.com/XXXservice.asmx?wsdl',
        [
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'soap_version' => SOAP_1_2,
            'trace' => true,
        ]
    );

    $data = new \stdClass();
    $data->Userid = 'YourUserId';
    $data->Username = 'YourUsername';

    $result = $client->GetAcData($data);

    // $result will be an object
    echo "<pre>";
    var_dump($result);
    echo "
";} catch (\ SoapFault $ fault) {// обработка ошибок}

Более подробно вы можете написатьобъекты данных для каждого сложного типа, упомянутого в функциях и типах, выводимых из вашего веб-сервиса.Вы можете добавить карту классов в массив опций при создании экземпляра мыльного клиента, чтобы каждый ответ и запрос автоматически анализировались в соответствующем объекте данных.Работа с клиентскими классами объясняется в документации php.

Просто попробуйте. Я уверен, что вы получите это самостоятельно.;)

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