我正在尝试连接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