Как мне сделать SOAP-запрос в php, как в SoapUI? - PullRequest
0 голосов
/ 24 апреля 2019

Я новичок в php и все потерялся при выполнении запроса на мыло. У меня есть другой вопрос Как отправить запрос SOAP в javascript, как в SoapUI , на который я только что получил ответ, но теперь я решил работать в php вместо Node.js. Поскольку я хочу, чтобы мой php-код делал то же самое, я повторю свой предыдущий вопрос ниже:

У меня есть этот WSDL-сайт, на который мне нужно получить ответы. Я понял, как это сделать в SoapUI, но я не знаю, как это сделать в php. Запрос, который я отправляю в soapUI, выглядит так:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:uni="https://uni-login.dk">
   <soap:Header/>
   <soap:Body>
      <uni:hentDataAftaler>
         <uni:wsBrugerid>?</uni:wsBrugerid>
         <uni:wsPassword>?</uni:wsPassword>
      </uni:hentDataAftaler>
   </soap:Body>
</soap:Envelope>

У меня также есть wsdl-ссылка: https://wsiautor.uni -login.dk / wsiautor-v4 / ws? WSDL

Надеюсь, у меня есть несколько предложений и скажите, если вам понадобится дополнительная информация, чтобы ответить на мой вопрос:)

Ответ на мой предыдущий вопрос был следующим

    const soapRequest = require('easy-soap-request');
    const url = 'https://wsiautor.uni-login.dk/wsiautor-v4/ws';
    const headers = {
      'Content-Type': 'application/soap+xml;charset=UTF-8',
      'soapAction': 'https://wsiautor.uni-login.dk/hentDataAftaler',
};
// example data
const xml = `
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:uni="https://uni-login.dk">
   <soap:Header/>
   <soap:Body>
      <uni:hentDataAftaler>
         <uni:wsBrugerid>?</uni:wsBrugerid>
         <uni:wsPassword>?</uni:wsPassword>
      </uni:hentDataAftaler>
   </soap:Body>
</soap:Envelope>
`;


// usage of module
soapRequest(url, headers, xml).then(({response: {body, statusCode}}) => {
    console.log(body);
    console.log(statusCode);
}).catch((errorBody) => {
    console.error(errorBody);
});

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

вы можете использовать собственный класс PHP SoapClient для достижения вашего плана.В вашем случае это еще проще сделать с помощью SoapClient, потому что код будет менее сложным и простым для понимания.

<code>$client = null;

try {
    $client = new SoapClient(
        'https://wsiautor.uni-login.dk/wsiautor-v4/ws?WSDL',
        [
            'cache_wsdl' => WSDL_CACHE_NONE,
            'encoding' => 'utf-8',
            'exceptions' => true,
            'soap_version' => SOAP_1_1,
            'trace' => true,
        ],
    );
} catch (SoapFault $e) {
    echo "<pre>";
    var_dump($e->getMessage());
    echo "
"; if ($ client instanceof SoapClient) {echo"
";
        var_dump($client->__getLastRequest(), $client->__getLastResponse());
        echo "
";}}

Если мы посмотрим на этот пример кода, мы создадим простой SoapClient с вашим wsdl url и некоторыми опциями, которые предоставляют доступ к некоторым действительно классным функциям отладки. Опция trace включает функции __getLastRequest() и __getLastResponse(), чтобы вы могли легко просматривать то, что было отправлено и что было ответом, если клиент жив. Вам следует установить для этого параметра значение false. Также параметр cache_wsdl следует удалить, когда процесс разработкизакончилась.

Отправка данных с помощью класса PHP SoapClient

Если мы посмотрим на ваш файл wsdl, мы сможем увидеть точное определение функции и типы этогофункция нуждается в. Итак, давайте посмотрим, что нужно hentDataAftaler.

<message name="hentDataAftalerIn">
    <part name="parameters" element="uni:hentDataAftaler"/>
</message>

Это определение для запроса hentDataAftaler. Оно говорит, что эта функция требует атрибут типае uni:hentDataAftaler.В этом случае uni - это пространство имен, в котором определено hentDataAftaler.В вашем файле wsdl также сказано, что определения типов для пространства имен uni определены в отдельном файле xsd, который импортирует другой файл xsd.После глубокого погружения в определения xsd ваш параметр запроса определяется следующим образом:

<xs:complexType name="Credentials">
    <xs:sequence>
        <xs:element name="wsBrugerid" type="xs:string"/>
        <xs:element name="wsPassword" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

С этим знанием вы можете легко вызывать ваш метод веб-сервиса с помощью php.Как определено, ваш параметр является сложным типом, равным объекту PHP.

class Credentials
{
    public $wsBrugerid;
    public $wsPassword;

    public function __construct(SoapVar $wsBrugerid, SoapVar $wsPassword)
    {
        $this->wsBrugerid = $wsBrugerid;
        $this->wsPassword = $wsPassword;
    }
}

$parameters = new Credentials(
    new SoapVar('brugerid', XSD_STRING, null, null, 'wsBrugerid', 'https://uni-login.dk'),
    new SoapVar('password', XSD_STRING, null, null, 'wsPassword', 'https://uni-login.dk')
);

$result = $client->hentDataAftaler($parameters);

Что мы здесь сделали?Мы адаптировали сложный тип из определения xsd в класс PHP.Этот класс принимает два параметра как объекты SoapVar, в которых мы определяем значение и пространство имен.В конце мы можем взять этот объект в качестве параметра и вызвать метод веб-сервиса hentDataAftaler.Мыло-клиент автоматически знает имя функции, потому что мыло-клиент берет эту информацию непосредственно из файла wsdl.

Надеюсь, это немного поможет.

0 голосов
/ 24 апреля 2019

Для этого можно использовать как минимум два добавочных номера.

Я бы порекомендовал старое и хорошее расширение curl.

Еще один совет: Почтальон вы можете сгенерировать код для HTTP-запросов, используя curl или http-request.Вы можете найти его в правом верхнем углу, рядом с кнопкой send .

Удостоверьтесь, что вы устанавливаете расширение первым (в моем случае, установлено с помощью apt):

sudo apt-get install php-curl

В любом случае, я считаю, что вы можете использовать этот код для достижения этой цели:

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_PORT => "80",
  CURLOPT_URL => "https://wsiautor.uni-login.dk/wsiautor-v4/ws",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" 
  xmlns:uni=\"https://uni-login.dk\">
    <soapenv:Header/>
     <soapenv:Body>
       <uni:hentDataAftaler>
         <uni:wsBrugerid>?</uni:wsBrugerid>
         <uni:wsPassword>?</uni:wsPassword>
       </uni:hentDataAftaler>
      </soapenv:Body>
    </soapenv:Envelope>",
  CURLOPT_HTTPHEADER => array(
    "Content-Type: application/soap+xml;charset=UTF-8",
    "soapAction: https://wsiautor.uni-login.dk/hentDataAftaler"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
...