在php中连接Nav Web Service

时间:2013-07-30 10:22:10

标签: php web-services nav

我正在尝试连接Php中的Nav Web Services(后跟此Blog)。

但是它返回了一个错误:

  

SOAP-ERROR:解析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();
}
?>

3 个答案:

答案 0 :(得分:0)

我正在处理完全相同的问题,但是没有找到解决方案,因为它们都回到了同一个脚本。您的问题是由于401错误代码(无法进行身份验证)而导致您没有得到任何结果,这正是我被困的地方。该脚本最终使用CURL进行连接,但不知何故失败了。

答案 1 :(得分:0)

使用此

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

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

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

此外,在哪里定义(&#39; USERPWD&#39;,&#39; user:pass&#39;);在你的代码?你没有使用身份验证吗?我有一种强烈的感觉,你只需要定义它。确保您定义了&#39;域名&#39;如果您使用的是域名,请在用户名字段中输入。所以,&#39;域\用户:传递&#39;。

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

答案 2 :(得分:0)

代替使用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);