我正在尝试调用公开xmlport的WebService函数。我能够使用C#来实现这一点,但无法用PHP来解决这个问题。
当我在C#中执行此操作时,我添加了一个Web服务引用,它将我的xml端口公开给我的项目。我基本上填充了XML节点,我可以将它传递给我的Codeunit Web服务。我不确定如何在PHP中完成这项工作。
我是一名Nav Developer,正在与PHP开发人员一起开展Web集成项目。我对PHP知之甚少,他对Navision了解不多。
Top Screenshot是我的Codeunit函数,它已作为Web服务公开。底部的截图是我的.Net代码。突出显示的区域显示我使用Web服务的URL向我的项目添加了Web服务引用。
答案 0 :(得分:0)
您应该检查一些事项。 您是否将身份验证方法设置为NTLM?这是在Dynamics NAV服务的de CustomSettings.config文件中完成的,并且是PHP可以对NAV Web服务进行身份验证的唯一方法。
您应该设置此值:
<add key="ServicesUseNTLMAuthentication" value="true" />
这里有一个工作示例: https://laravel.com/docs/5.1/eloquent#query-scopes
答案 1 :(得分:0)
正如gbierkens已经指出的那样,您需要确保在 CustomSettings.config 文件中启用了NTLM:
<add key="ServicesUseNTLMAuthentication" value="true" />
就个人而言,我并不喜欢使用SoapClient或库来发送您的HTTP请求并处理您的回复。如果你知道如何在PHP中解析XML,你可以使用cURL并自己解析XML响应。
在这种情况下,向您的SOAP或Odata服务发送GET请求真的可以这么简单:
// 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 services代替。
我不仅发现Odata协议比SOAP协议更直观,它还具有支持Json而不是XML用于服务器和客户端之间通信的额外优势,这使得从标准PHP数组或对象的转换变得容易作为馅饼。