0

我正在尝试在 Php 中连接 Nav Web 服务(随后是这个Blog)。

但它返回一个错误:

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();
}
?>
4

3 回答 3

0

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

于 2013-08-06T09:48:29.873 回答
0

用这个

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

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

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

另外,define('USERPWD','user:pass'); 在你的代码中?你没有使用身份验证吗?我有一种强烈的感觉,你只需要定义它。如果您使用的是域,请确保在用户名字段中定义“域”部分。所以,“域\用户:通过”。

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

于 2014-04-05T05:39:37.770 回答
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);
于 2020-05-04T19:14:55.193 回答