向Navision SOAP Service发送命令

时间:2017-11-03 14:41:25

标签: php curl soap navision

我尝试将命令发送到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进程,但我也没有在网上找到任何非常好的教程。我究竟做错了什么?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您应该尝试使用真正的WSDL到PHP生成器,因为它将真正简化您对SOAP Web服务的使用。想要了解它是如何工作的很好,但你应该从使用正确的类开始。

首先,您不应该直接使用curl,因此您应该使用本机PHP SoapClient类。这是使用WSDL url的起点,然后尝试调用SoapClient实例上的__getTypes和__getFunctions,以了解SOAP Web服务的期望。

然后尝试使用WSDL到PHP生成器,例如PackageGenerator项目。它基本上加载&#34;类型&#34;和&#34;功能&#34;由WSDL声明并将它们包装到基本类和方法中,然后您可以轻松地使用这些类和方法发送请求并接收响应。