2016-04-29 29 views
6

我是nusoap和一般Web服务的新手。NuSoap - 如何在nusoap_client中使用本地现有的WSDL文件PHP

wsdl文件来自客户端。我有一个基本的Web服务与通过网络地址提供WSDL中的默认URL工作:http://hiddenurl.com/ws/schema/Terminal.wsdl

但客户端的文件说: “请本地下载的WSDL和XML架构文件为您的代码使用别。每次从我们的服务器获取这些文件。“

所以我一直试图在本地托管wsdl文件,或通过我自己的web服务器,但都没有工作。

我曾尝试:

$wsdlUrl = 'http://supplied-url.com/schema/Terminal.wsdl' // working but discouraged 

$wsdlUrl = 'http://my-own-IIS-based-url/schema/Terminal.wsdl' // url loads and I can 
    // view wsdl file, but when I load run webservice is returns blank/nothing 

$wsdlUrl = 'path/to/local/Terminal.wsdl' // returns blank or 'boolean'false' 

$tempUrl = realpath('path/to/local/Terminal.wsdl') // get absolute url 
wsdlUrl = tempUrl; // returns blank screen or 'boolean'false' 

有什么办法,我可以有Web服务使用WSDL文件从比原先客户端提供了一个不同的位置?我已经看到一些引用Web服务器返回wsdl与http://getfile.php?file.wsdl类型,但我不明白'getfile.php'为了通过查询字符串提供wsdl会是什么。

这是我的PHP代码来调用Web服务。同样,它可以与客户端提供的wsdl文件的URL一起使用,但当我尝试以任何其他方式访问wsdl文件时不会。

<?php 
require_once('nusoap.php'); 

$URI = 'http://api.hiddenurl.com/ws/schema'; 

$env = 'api'; 
$wsdlUrl = 'http://'.$env.'.hiddenurl.com/schema/Terminal.wsdl'; 
$licenseKey = 'xxxx-xxxx-xxxx-xxxx-xxxx'; 
$userName = 'user'; 
$password = 'password'; 

$service = new nusoap_client($wsdlUrl, true); 

// login credentials 
$service->setHeaders(
'<wsse:Security xmlns:wsse="http://hiddenurl.xsd">'. 
'<wsse:UsernameToken>'. 
'<wsse:Username>'.$userName.'</wsse:Username>'. 
'<wsse:Password Type="http://hiddenurl#PasswordText">'.$password.'</wsse:Password>'. 
'</wsse:UsernameToken>'. 
'</wsse:Security>' 
); 

$msg = 
'<GetDetailsRequest xmlns="'.$URI .'">'. 
'<messageId></messageId>'. 
'<version></version>'. 
'<licenseKey>'.$licenseKey.'</licenseKey>'. 
'<iccids>'. 
'<iccid>'.'xxxxxxxxxxxxxxx'.'</iccid>'. 
'</iccids>'. 
'</GetDetailsRequest>'; 

$result = $service->call('GetlDetails', $msg); 

if ($service->fault) { 
    echo 'faultcode: ' . $service->faultcode . "\n"; 
    echo 'faultstring: ' . $service->faultstring . "\n"; 
    echo 'faultDetail: ' . $service->faultdetail . "\n"; 
    echo 'response: ' . $service->response; 
    exit(0); 
} 

echo "<pre>"; 
var_dump($result); 
echo "</pre>"; 

?> 

非常感谢。

+0

'路径/到/本地/ Terminal.wsdl'应该工作 - 你确定你正在传递正确的路径? 'file_exists('path/to/local/Terminal.wsdl')'的返回值是什么? – FuzzyTree

+1

感谢您的评论。 'file_exists('path/to/local/Terminal.wsdl')'返回1,其中我假设'1 == true'。 – 100pic

+0

最近版本的php自带肥皂客户端(https://secure.php.net/manual/en/class.soapclient.php),如果更改客户端是可能性,我建议尝试本地客户端 – FuzzyTree

回答

5

试试这个

$wsdl_location= realpath('path/to/local/Terminal.wsdl'); 
$wsdl_cache = new nusoap_wsdlcache("/tmp"); // for caching purposes 
$wsdl_obj = $wsdl_cache->get($wsdl_location); 
if (empty($wsdl_obj)) { 
    $wsdl_obj=new wsdl($wsdl_location); 
    $wsdl_cache->put($wsdl_obj); 
} 
$service = new nusoap_client($wsdl_obj,true); 
0

尝试使用本地主机路径:

$ WSDLURL = 'http://localhost/schema/Terminal.wsdl';

p.s.此网址在浏览器中不起作用,但可以通过服务器上的php脚本执行。

+1

为什么这与他已经尝试的'$ wsdlUrl ='http:// my-own-IIS-based-url/schema/Terminal.wsdl''不同 – Christiaan

相关问题