Я пытаюсь отправить команды в веб-службу Navision. Чтобы понять все соединение как можно лучше, сначала я хочу использовать простые команды cURL.
Я экспериментировал с простыми запросами GET по URL https://IP:PORT/.../Codeunit/Webservices
, Там я получил очень длинную структуру XML со всеми командами. Часть списка — это простая команда echo, где я могу отправить строку и получить ее обратно.
Это описание этого:
<schema elementFormDefault="qualified" targetNamespace="urn:microsoft-dynamics-schemas/codeunit/Webservices" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="SoundCheck">
<complexType>
<sequence>
<element minOccurs="1" maxOccurs="1" name="p_Text" type="string"/>
</sequence>
</complexType>
</element>
<element name="SoundCheck_Result">
<complexType>
<sequence>
<element minOccurs="1" maxOccurs="1" name="return_value" type="string"/>
</sequence>
</complexType>
</element>
...
Теперь моя проблема в том, что я не знаю, как отправить команду. Я посмотрел в этих двух специальных библиотеках SOAP:
Я пробовал их подходы, но ничего не работает. Мой фрагмент кода теперь выглядит так:
$headers = [
'Method: GET',
'Connection: Keep-Alive',
'User-Agent: PHP-SOAP-CURL',
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: "' . $action . '"',
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
return $response;
Я пытался отправить различные значения $action
но я всегда получаю эту ошибку:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault>
<faultcode xmlns:a="urn:microsoft-dynamics-schemas/error">a:System.ArgumentNullParametername: input</faultstring>
<detail><string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Der Wert darf nicht NULL sein.\nParametername: input</string></detail>
</s:Fault></s:Body></s:Envelope>
Возможно, я неправильно понял весь процесс SOAP с помощью navision, но я также не нашел ни одного действительно хорошего учебника в Интернете. Что я делаю неправильно? Спасибо за помощь!
Вам следует попробовать настоящий генератор WSDL to PHP, так как он действительно облегчит использование веб-службы SOAP. Замечательно хотеть понять, как это работает, но вы должны начать с использования правильных классов.
Во-первых, вы не должны использовать curl напрямую, поэтому вы должны использовать собственный класс PHP SoapClient. Это отправная точка с использованием URL-адреса WSDL, затем попробуйте вызвать __getTypes и __getFunctions в экземпляре SoapClient, чтобы узнать, чего ожидает веб-служба SOAP.
Затем попробуйте генератор WSDL в PHP, такой как PackageGenerator проект. Он в основном загружает «типы» и «функции», объявленные WSDL, и переносит их в базовые классы и методы, которые затем можно легко использовать для отправки запроса и получения ответа.
Других решений пока нет …