PHP 和 SOAP-Client Call 方法两个参数和一个 ArrayMultidimensional 中的问题
Problem in PHP and SOAP-Client Call method two parameters and one ArrayMultidimensional
我在调用 WebServer 的方法时遇到问题,该方法需要三个 String 类型的参数,另一个是具有另外三个参数的子元素。
我将所有内容都作为多维数组传递,但它不起作用。 SOAPClient发送给webserver的结构中,没有添加多目标数组,只保留前两个参数。
代码 PHP 肥皂示例:
$ws = new \SoapClient($this->getWSUrl()
,[
'trace'=>true,
'soap_version'=>SOAP_1_2,
'encoding'=>'utf-8',
'connection_timeout'=>'10',
'cache_wsdl'=> WSDL_CACHE_NONE,
]);
$parameters = array(
'token' => 'xxxxxx',
'usuario' => 'xxxxxxx',
'archivo' => array(
'fileType' => 'text/xml',
'nombre' => 'test.xml',
'xml' => 'PD94bW..xxxxxxxxxx.0dWQ+'
)
);
$ws->MyFunctionInWebServer($parameters);
echo $ws->__getLastRequest();
SOAP生成的XML如下,错误的是没有元素"archivo"
OUT 请求 SOAP:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxxxxxxxxx.xxx/">
<env:Body>
<ns1:enviarSolicitud>
<token>xxxxxxxx</token>
<usuario>xxxxxx</usuario>
</ns1:enviarSolicitud>
</env:Body>
</env:Envelope>
当请求必须是:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxxxxxxxxx.xxx/">
<env:Body>
<ns1:enviarSolicitud>
<token>xxxxxxxx</token>
<usuario>xxxxxx</usuario>
<archivo>
<fileType>text/xml</fileType>
<nombre>test_21.xml</nombre>
<xml>PD94xxxxxx0dWQ+</xml>
</archivo>
</ns1:enviarSolicitud>
</env:Body>
</env:Envelope>
您可以通过 SOAPClient 传递该类型..???
我的解决方案是在 $parametersArray 中使用 SoapVar() 并且对字符串有效 XML BaseEncode64 :
$ws = new \SoapClient($this->getWSUrl()
, [
//'trace' => true,
'encoding' => 'utf-8',
'connection_timeout' => '10',
'cache_wsdl' => WSDL_CACHE_MEMORY,
]);
$parm = array();
$subparm = array();
$parm[] = new SoapVar($parametersArray['token'], XSD_STRING, null, null, 'token');
$parm[] = new SoapVar($parametersArray['usuario'], XSD_STRING, null, null, 'usuario');
$subparm[] = new SoapVar($parametersArray['archivo']['fileType'], XSD_STRING, null, null, 'fileType');
$subparm[] = new SoapVar($parametersArray['archivo']['nombre'], XSD_STRING, null, null, 'nombre');
$subparm[] = new SoapVar($parametersArray['archivo']['xml'], XSD_STRING, null, null, 'xml');
$parm[] = new SoapVar($subparm, SOAP_ENC_OBJECT, null, null, 'archivo');
$resp = new SoapVar($parm, SOAP_ENC_OBJECT);
$data = json_decode(json_encode($ws->generarSolicitud($resp)->return), true);
//exit(debug($ws->__getLastRequest()));
替代方法很简单,对我在 'xml' 中的 dataArray 无效,更改 stringBaseCode64 ;-(
$ws = new \SoapClient($this->getWSUrl()
, [
//'trace' => true,
'encoding' => 'utf-8',
'connection_timeout' => '10',
'cache_wsdl' => WSDL_CACHE_MEMORY,
]);
$data = json_decode(json_encode($ws->generarSolicitud($parametersArray)->return), true);
//exit(debug($ws->__getLastRequest()));
我在调用 WebServer 的方法时遇到问题,该方法需要三个 String 类型的参数,另一个是具有另外三个参数的子元素。 我将所有内容都作为多维数组传递,但它不起作用。 SOAPClient发送给webserver的结构中,没有添加多目标数组,只保留前两个参数。
代码 PHP 肥皂示例:
$ws = new \SoapClient($this->getWSUrl()
,[
'trace'=>true,
'soap_version'=>SOAP_1_2,
'encoding'=>'utf-8',
'connection_timeout'=>'10',
'cache_wsdl'=> WSDL_CACHE_NONE,
]);
$parameters = array(
'token' => 'xxxxxx',
'usuario' => 'xxxxxxx',
'archivo' => array(
'fileType' => 'text/xml',
'nombre' => 'test.xml',
'xml' => 'PD94bW..xxxxxxxxxx.0dWQ+'
)
);
$ws->MyFunctionInWebServer($parameters);
echo $ws->__getLastRequest();
SOAP生成的XML如下,错误的是没有元素"archivo"
OUT 请求 SOAP:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxxxxxxxxx.xxx/">
<env:Body>
<ns1:enviarSolicitud>
<token>xxxxxxxx</token>
<usuario>xxxxxx</usuario>
</ns1:enviarSolicitud>
</env:Body>
</env:Envelope>
当请求必须是:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxxxxxxxxx.xxx/">
<env:Body>
<ns1:enviarSolicitud>
<token>xxxxxxxx</token>
<usuario>xxxxxx</usuario>
<archivo>
<fileType>text/xml</fileType>
<nombre>test_21.xml</nombre>
<xml>PD94xxxxxx0dWQ+</xml>
</archivo>
</ns1:enviarSolicitud>
</env:Body>
</env:Envelope>
您可以通过 SOAPClient 传递该类型..???
我的解决方案是在 $parametersArray 中使用 SoapVar() 并且对字符串有效 XML BaseEncode64 :
$ws = new \SoapClient($this->getWSUrl()
, [
//'trace' => true,
'encoding' => 'utf-8',
'connection_timeout' => '10',
'cache_wsdl' => WSDL_CACHE_MEMORY,
]);
$parm = array();
$subparm = array();
$parm[] = new SoapVar($parametersArray['token'], XSD_STRING, null, null, 'token');
$parm[] = new SoapVar($parametersArray['usuario'], XSD_STRING, null, null, 'usuario');
$subparm[] = new SoapVar($parametersArray['archivo']['fileType'], XSD_STRING, null, null, 'fileType');
$subparm[] = new SoapVar($parametersArray['archivo']['nombre'], XSD_STRING, null, null, 'nombre');
$subparm[] = new SoapVar($parametersArray['archivo']['xml'], XSD_STRING, null, null, 'xml');
$parm[] = new SoapVar($subparm, SOAP_ENC_OBJECT, null, null, 'archivo');
$resp = new SoapVar($parm, SOAP_ENC_OBJECT);
$data = json_decode(json_encode($ws->generarSolicitud($resp)->return), true);
//exit(debug($ws->__getLastRequest()));
替代方法很简单,对我在 'xml' 中的 dataArray 无效,更改 stringBaseCode64 ;-(
$ws = new \SoapClient($this->getWSUrl()
, [
//'trace' => true,
'encoding' => 'utf-8',
'connection_timeout' => '10',
'cache_wsdl' => WSDL_CACHE_MEMORY,
]);
$data = json_decode(json_encode($ws->generarSolicitud($parametersArray)->return), true);
//exit(debug($ws->__getLastRequest()));