我如何在PHP中的Navision中使用soap webservice中的CREATE函数?

时间:2014-11-27 12:51:10

标签: php web-services soap navision

Here你可以看到文档。它在C#中。我尝试使用PHP制作一个工作示例。我成功执行了 Read& PHP中的ReadMultiple 函数。这是我的尝试:

   require ("./NTLMSoapClient.php");
    $client = new NTLMSoapClient(null, array(
        'cache_wsdl' => WSDL_CACHE_NONE,
        'trace' => true,
        'location' => "http://83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem",
        'uri' => "urn:microsoft-dynamics-schemas/page/webitem",

    ));
    $client->user = "xxxxxx";
    $client->password = "xxxxxxxxx";
 try{

    $resp = $client->Create(new SoapVar('555554', XSD_STRING, null, null, 'ns1:No' ));
    echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
}catch(SoapFault $sf){
    //echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
    print '<pre>';
    print_r($sf); 
    print '</pre>'; 
}
print '<pre>';var_dump($resp);  print '</pre>';

由于某种原因它返回 NULL 。知道为什么不起作用吗?

2 个答案:

答案 0 :(得分:1)

弗雷迪·克里斯蒂安森(Freddy Kristiansen)撰写了一系列精彩的博客文章,详细解释了如何连接不同环境的导航网络服务。

第一部分在这里: Connecting to NAV Web Services from …

第二部分: Connecting to NAV Web Services from PHP

客户端可以出于多种原因接收NULL响应。首先 - 客户端应用程序无法在Web服务上进行身份验证。如果服务器端使用SPNEGO协议而不是NTLM,则会发生这种情况。您需要设置密钥&#34; ServicesUseNTLMAuthentication&#34;在CustomSettings.config中,正如Freddy在他的第一篇文章中描述的那样。

如果您可以从服务中读取数据,但无法创建记录,则表示请求成功通过了身份验证,问题很可能是SOAP消息格式。

这是Nav期望在创建请求中收到的内容

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <Create xmlns="urn:microsoft-dynamics-schemas/page/customer">
            <Customer>
                <No>555554</No>
                <Name>NewCustomer</Name>
            </Customer>
        </Create>
    </soap:Body>
</soap:Envelope>

要实现此结果,您可以使用NTLMStream包装器替换标准HTTP流包装器(请参阅文章&#34;从PHP连接到NAV Web服务&#34;上面。

现在,您只需阅读客户记录即可:

$client = new NTLMSoapClient("http://192.168.0.101:7047/DynamicsNAV71/WS/".rawurlencode($company)."/Page/Customer");
$resp = $client -> Read(array('No' => '10000'));

创建新记录也变得更加容易:

$client = new NTLMSoapClient("http://192.168.0.101:7047/DynamicsNAV71/WS/".rawurlencode($company)."/Page/Customer");

class CustomerWrapper
{
    public $Customer;
}

$cw = new CustomerWrapper;
$cw -> Customer -> No = "555554";
$cw -> Customer -> Name = "NewCustomerName";
$cw -> Customer -> E_Mail = "john.doe@cronuscorp.net";
$resp = $client -> Create($customer);

答案 1 :(得分:0)

这是解决方案:

$resp = $client->Create(new SoapVar('5555195', XSD_STRING, null, null, 'ns1:WebItem' ));

我必须将更改为 WebItem

见这里:

<xsd:element name="Create">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="WebItem" type="tns:WebItem"/></xsd:sequence></xsd:complexType>
</xsd:element>