我需要通过WebService向另一家公司报告一些邮件递送的状态。我使用的是PHP+NuSoap,我是PHP的新手,这个库帮助我保持简单,我的代码看起来像这样:
require_once '../nusoap/lib/nusoap.php';
Class Cliente{
var $server;
public function __construct(){
$this->server = 'https://the-other-company.com/services/PksiryacwebMgrTarjetasSubsi?wsdl';
}
function client_process($data){
$cliente = new nusoap_client($this->server,'wsdl','','','','');
$err = $cliente->getError();
if ($err) { echo 'Error en Constructor' . $err ; }
$response = $cliente->call('prwebActualizaCorresponden',$data,'','', false,true); //OK
return $response;
}
}
其中$data
是一个字符串数组,WebService服务器被假定返回响应(始终),但不回复任何内容。
当我打电话给WebService管理员时,他告诉我使用SoapUI测试它,然后我发现问题出在WSDL上,因为它指向一个只能从另一家公司局域网内部访问的专用IP地址(172.20.8.152),而不是我被告知要工作的IP(另一家公司.com)。
<wsdl:service name="PksiryacwebMgr_Tarjetas_SubsiService">
<wsdl:port binding="impl:PksiryacwebMgr_Tarjetas_SubsiSoapBinding" name="PksiryacwebMgr_Tarjetas_Subsi">
<wsdlsoap:address location="http://172.20.8.152/services/PksiryacwebMgrTarjetasSubsi"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
在SoapUI中,用正确的IP设置另一个EndPoint很容易解决这个问题,但如何在NuSoap中做到这一点?
编辑:一个变通方法是制作我自己的wsdl/xml,但这不是我的想法。
提前谢谢。
使用函数setEndpoint,它是在nusoap.hp:的7873行附近定义的
/**
* sets the SOAP endpoint, which can override WSDL
*
* @param string $endpoint The endpoint URL to use, or empty string or false to prevent override
* @access public
*/
function setEndpoint($endpoint)
{
$this->debug("setEndpoint("$endpoint")");
$this->forceEndpoint = $endpoint;
}
在您的测试中,代码可以通过以下方式使用:
require_once '../nusoap/lib/nusoap.php';
Class Cliente{
var $server;
var $endPoint;
public function __construct(){
$this->server = 'https://the-other-company.com/services/PksiryacwebMgrTarjetasSubsi?wsdl';
$this->endPoint = 'http://172.20.8.152/services/PksiryacwebMgrTarjetasSubsi';
}
function client_process($data){
$cliente = new nusoap_client($this->server,'wsdl','','','','');
$cliente->setEndpoint($this->endPoint);
$err = $cliente->getError();
if ($err) { echo 'Error en Constructor' . $err ; }
$response = $cliente->call('prwebActualizaCorresponden',$data,'','', false,true); //OK
return $response;
}
}