I am working on a SOAP client in PHP, and the calls are going through to the service fine, with the exception of calls where there are elements that are identical to each ot
Hello You can try this fix:
You need to extends the SoapClient and fix the generated request:
You need to add the tags that are causing problems here
$tags = ['Tag1', 'Tag2', 'Tag3'];
And then use the MySoapClient instead of SoapClient
class MySoapClient extends SoapClient {
public function __construct($a, $b){
parent::__construct($a, $b);
}
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$tags = ['Tag1', 'Tag2', 'Tag3'];
foreach($tags as $tag){
if (preg_match("~<ns1:{$tag} id=\"ref(.+)\">(.+)</ns1:{$tag}>~ismU", $request, $matches)) {
$ref = $matches[1];
$request = str_replace([' id="ref'.$ref.'"'], '', $request);
$tagValue = "<ns1:{$tag}>{$matches[2]}</ns1:{$tag}>";
$request = str_replace("<ns1:{$tag} href=\"#ref{$ref}\"/>", $tagValue, $request);
}
}
return parent::__doRequest($request, $location, $action, $version);
}
}
In your PHP code make a property with unique index so the resulting XML will look like:
<ns1:someelement>
<ns1:name>name1</ns1:name>
<ns1:value>value1</ns1:value>
<ns1:index>0</ns1:value>
</ns1:someelement>
<ns1:someelement>
<ns1:name>name1</ns1:name>
<ns1:value>value1</ns1:value>
<ns1:index>1</ns1:value>
</ns1:someelement>
Then PHP SoapClient will not make href references to the same copies of data and web service successfully ignored these unique fields in my case. No, I do not pass the same fields of someelement as reference in PHP code. They are cloned, however PHP SoapClient is smart enough to zip their multiple occurencies as references, unfortunately.
SoapParam
SoapVar
$soapClient->__soapCall('Method', array(
new SoapParam($someelement1, 'someelement'),
// or
new SoapVar('<ns1:someelement><ns1:name>name1</ns1:name><ns1:value>value1</ns1:value></ns1:someelement>', XSD_ANYXML)
));
SoapClient makes a reference only when you use the same object on multiple XML nodes. Make for each place a new object if you do not want the references.