我尝试将命令发送到Navision Web服务。为了尽可能地了解整个连接,我想先使用简单的cURL命令。
我在网址https://IP:PORT/.../Codeunit/Webservices
上体验过简单的GET请求。在那里,我得到了一个包含所有命令的非常长的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库:
我试过他们的approches但没有任何作用。我的代码片段现在看起来像这样:
$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>
也许我用navision误解了整个SOAP进程,但我也没有在网上找到任何非常好的教程。我究竟做错了什么?谢谢你的帮助!
答案 0 :(得分:0)
您应该尝试使用真正的WSDL到PHP生成器,因为它将真正简化您对SOAP Web服务的使用。想要了解它是如何工作的很好,但你应该从使用正确的类开始。
首先,您不应该直接使用curl,因此您应该使用本机PHP SoapClient类。这是使用WSDL url的起点,然后尝试调用SoapClient实例上的__getTypes和__getFunctions,以了解SOAP Web服务的期望。
然后尝试使用WSDL到PHP生成器,例如PackageGenerator项目。它基本上加载&#34;类型&#34;和&#34;功能&#34;由WSDL声明并将它们包装到基本类和方法中,然后您可以轻松地使用这些类和方法发送请求并接收响应。