在php中连接Nav Web服务


Connecting Nav Web Service in php

我正在尝试连接Php中的Nav Web服务(然后是这个博客)。

但它返回了一个错误:

SOAP-错误:分析WSDL:无法从加载'http://NavIP.com:7047/DynamicsNAV/WS/SystemService':开始标记应为"<"找不到。

你能告诉我哪里出了问题吗?

提前谢谢。。

我的代码是:

//client.php

     <?php
require_once("NTLMStream.php");
require_once("NTLMSoapClient.php");
try
{
// we unregister the current HTTP wrapper 
stream_wrapper_unregister('http'); 
// we register the new HTTP wrapper 
stream_wrapper_register('http', 'NTLMStream') or die("Failed to register protocol");
// Initialize Soap Client 
$baseURL = 'http://NavIp.Com:7047/DynamicsNAVPMS/WS/';
$client = new NTLMSoapClient($baseURL.'SystemService'); 
// Find the first Company in the Companies 
$result = $client->Companies(); 
$companies = $result->return_value; 
echo "Companies:<br>"; 
if (is_array($companies)) { 
  foreach($companies as $company) { 
    echo "$company<br>"; 
  } 
  $cur = $companies[0]; 
} 
else { 
  echo "$companies<br>"; 
  $cur = $companies; 
} 
}
catch(Exception $ex)
{
    echo $ex->getMessage();
}
?>

我正在处理完全相同的问题,但还没有找到解决方案,因为他们都回到了同一个脚本。你的问题是,由于401错误代码(无法验证),你没有得到任何结果,这正是我所处的位置。脚本最终使用CURL进行连接,但不知何故失败了。

使用此

$client = new NTLMSoapClient(null, $baseURL.'SystemService'); 

您错误地提供了被视为WSDL位置的baseURL。在您的代码中,似乎您正在尝试提供服务端点。试试看。

你也可以使用像"Wireshark"这样的数据包嗅探器来查看你得到了什么响应。预期的响应是一个xml,它似乎没有返回。也许它是在归还未经授权的401?这不是XML响应,也可能是原因之一。

此外,其中是define('USERPWD','user:pass');在你的代码中?你没有使用身份验证吗?我有一种强烈的感觉,你只需要定义它。如果你使用域,请确保在用户名字段中定义"域"部分。因此,"domain''user:pass"。

这篇文章很好:http://blogs.msdn.com/b/freddyk/archive/2010/01/19/connecting-to-nav-web-services-from-php.aspx

不要使用NTLM,而是尝试直接使用基本身份验证,然后使用cURL。这很容易。请参阅下面的代码以获得一个简单的实现。您可以使用SOAP或ODATA

您还应该使用名为Wizdler 的Chrome扩展

有关基本实现,请参阅下面的示例代码

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://navdynamicsip.com:port/WebService/WS/COMPANY NAME/Page/webservice",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_POSTFIELDS =>"<?xml version='"1.0'" encoding='"utf-8'"?>'n<Envelope xmlns='"http://schemas.xmlsoap.org/soap/envelope/'">'n<Body>'n<Read xmlns='"urn:microsoft-dynamics-schemas/page/webservice'"></Read>'n</Body>'n</Envelope>",
    CURLOPT_HTTPHEADER => array(
        "Content-Type: text/xml; charset=utf-8",
        "SoapAction: urn:microsoft-dynamics-schemas/page/webservice",
        "Authorization: Basic " .base64_encode('username:password')
    ),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

在Navision中启用NTLM身份验证,然后在curl调用中使用CURLAUTH_NTLM而不是CURLAUTH_BASIC