вы можете использовать собственный класс 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.
Надеюсь, это немного поможет.