我已经使用AXIS部署了SOAP WS。我在Ubuntu 14.04上使用SOAPClient库和PHP 5.5.9来调用公开的操作,但是当我创建“__SoapCall”时它什么也没有返回。我也试过“NuSOAP”库,但我得到了相同的结果。 但是,当我调用“__getLastResponse”时,它会返回良好的响应(尽管重复),如您所见:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<idXMLReturn xmlns="http://aemetproyecto">PD94bWwgdm...</idXMLReturn>
</soapenv:Body>
</soapenv:Envelope>
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<idXMLReturn xmlns="http://aemetproyecto">PD94bWwgdm...</idXMLReturn>
</soapenv:Body>
</soapenv:Envelope>
我的PHP代码:
<?php
function generarTabla($id, $formato){
try{
// Create the SoapClient instance
$url = "http://localhost:8080/axis/services/AemetProyect?wsdl";
$client = new SoapClient($url, array("trace" => 1, "exception" => 1));
// Creo XML
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml .= "<!DOCTYPE id [\n";
$xml .= "<!ELEMENT id (#PCDATA)>\n";
$xml .= "]>\n";
$xml .= "<id>".$id."</id>";
// Codifico XML en Base64
$Base64xml = base64_encode($xml);
// Llamada SOAP a DescargarInfoTiempo
$resultado = $client -> __soapCall("DescargarInfoTiempo",
array($Base64xml));
//$resultado = $client -> __getLastResponse();
//echo $resultado;
//$resultado = $client -> __getLastRequest();
//echo $resultado;
echo $resultado;
} catch (SoapFault $ex){
$error = "SOAP Fault: (faultcode: {$ex->faultcode}\n"
."faultstring: {$ex->faultstring})";
echo $error;
} catch (Exception $e){
$error = "Exception: {$e->faultstring}";
echo $error;
}
}
?>
我注意到返回元素的名称(“idXMLReturn”)与WSDL中描述的名称(“DescargarInfoTiempoReturn”)不同。 这可能是问题吗?
更新
我试过:
$argumens['idXML'] = $Base64xml;
$resultado = $client -> __soapCall("DescargarInfoTiempo",
array($arguments));
和
$arguments['idXML'] = $Base64xml;
$resultado = $client ->DescargarInfoTiempo($arguments);
但是当我接听电话时,我得到“通知:数组到字符串转换”。
答案 0 :(得分:1)
您的错误有点详细。
对于使用SoapClient的调用,您必须在参数数组中发送参数,而不是发送xml(为什么需要编写base64?是WebService的一些规则吗?)。请参阅PHP docs以获得正确的方法
<强>参数强> 传递给函数的参数数组。这可以是有序数组或关联数组。请注意,大多数SOAP服务器都需要提供参数名称,在这种情况下,它必须是关联数组。
所以,你的数组参数*必须是这样的:
$arguments['id'] = $id// if you need base 64, use base64_encode($id) or something
$resultado = $client -> __soapCall("DescargarInfoTiempo",array($arguments));
执行相同操作的其他选项是直接调用函数:
$arguments['id'] = $id// if you need base 64, use base64_encode($id) or something
$resultado = $client ->DescargarInfoTiempo($arguments);// note that we don't need array($arguments), just $arguments
请参阅文档页面上的评论中的其他示例。
最后,如果您仍想创建要发送的XML,我建议您使用其他方法(如file_get_contents或CURL)执行此操作,并且不要忘记使用soap信封创建XML,{ {3}}
*一些旧的WebServices需要一个名为&#34;参数&#34;
的数组<强>更新强>
看,您尝试在只包含一个元素的数组中发送$参数:$ Base64xml var中的XML。我认为问题仍然存在。
根据Soap Protocol ,您无法在SoapCall中发送XML 。 var必须是与您的vars 的关联数组,因此请尝试执行以下操作:
$arguments['id'] = $id// this $id var is your function argument(int, string or somenthing else), forget the created XML
$resultado = $client -> __soapCall("DescargarInfoTiempo",array($arguments));
关于您需要的base64,我之前从未需要它,但请参阅PHP manual
页面中的 marcovtwout 评论如果您的WSDL文件包含base64Binary类型的参数,则在传递soap变量时不应使用base64_encode()。在执行请求时,SOAP库会自动对您的数据进行base64编码,否则您将对其进行两次编码。
所以,我相信你不需要对你的vars进行编码。
简而言之,忘记XML并仅发送您的变量。 PHP SoapClient使用更正的编码和所有这些东西创建Soap信封。
如果您在执行此操作时仍遇到问题,请尝试将var包含在PHP manual中。也许你的WSDL配置需要这种处理。
我希望这会有所帮助
答案 1 :(得分:0)
正如我上面所说,&#34;我注意到返回元素的名称(&#34; idXMLReturn
&#34;)与WSDL中描述的名称不同( &#34; DescargarInfoTiempoReturn
&#34)&#34;
那就是问题所在:AXIS没有生成适合WSDL架构的Envelope。看来java:RPC提供商并不担心操作的返回名称。
目前,我已经通过重命名参数&#34; idXML
&#34;来解决这个问题。到&#34; DescargarInfoTiempo
&#34;,所以SOAP响应将是&#34; DescargarInfoTiempoReturn
&#34;它将适合WSDL模式,PHP将正确映射响应。
答案 2 :(得分:0)
解决方案是指定文档文字样式,如中所述 Creating a SOAP call using PHP with an XML body