Я пытаюсь вызвать функцию WebService, которая предоставляет xmlport. Я могу заставить это работать с использованием C #, но не могу понять это с помощью PHP.
Когда я делаю это в C #, я добавляю ссылку на веб-сервис, которая предоставляет мой порт xml моему проекту. Я в основном заполняю узлы XML и могу передать их в свой веб-сервис Codeunit. Я не уверен, как это можно сделать в PHP.
Я разработчик Nav, который работает над проектом Web Integration с разработчиком PHP. Я не очень разбираюсь в PHP, а он мало что знает о Navision.
Верхний снимок экрана — это моя функция Codeunit, представленная в виде веб-службы. Нижний снимок экрана — мой код .Net. Выделенная область показывает, что я добавил ссылку на веб-службу в свой проект, используя URL-адрес веб-службы.
Есть несколько вещей, которые вы должны проверить.
Вы установили метод аутентификации на NTLM? Это делается в файле de CustomSettings.config Сервиса Dynamics NAV и является единственным способом, которым PHP может аутентифицироваться в веб-сервисе NAV.
Вы должны установить это значение:
<add key="ServicesUseNTLMAuthentication" value="true" />
Вот рабочий пример:
http://blogs.msdn.com/b/freddyk/archive/2010/01/19/connecting-to-nav-web-services-from-php.aspx
Как gbierkens уже указал, что вы должны убедиться, что NTLM включен в CustomSettings.config файл :
<add key="ServicesUseNTLMAuthentication" value="true" />
Лично мне не очень нравится использовать SoapClient или библиотеки только для отправки ваших HTTP-запросов и обработки ваших ответов. Если вы знаете, как анализировать XML в PHP, вы можете просто использовать cURL и анализировать ответы XML самостоятельно.
В этом случае отправка запроса GET в службу SOAP или Odata может быть действительно такой простой:
// Create curl handle
$ch = curl_init();
// Set HTTP options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
// Get & output response (= XML string)
echo curl_exec($ch);
// Close handle
curl_close($ch);
Анализ ответа SOAP может быть таким простым:
$xml = simplexml_load_string(str_ireplace(['SOAP-ENV:', 'SOAP:'], '', $response));
Если вам не нравится читать и писать необработанные SOAP-сообщения, вы можете использовать Сервисы Navision’s Odata вместо.
Я не только нахожу протокол Odata намного более интуитивным, чем протокол SOAP, он обладает дополнительным преимуществом поддержки Json вместо XML для обмена данными между сервером и клиентом, что делает преобразование из и в стандартные массивы или объекты PHP простым, как круговая диаграмма.