Bug #73089 [Com]: SOAP pass dictionary parameter
| From: | sjon at hortensius dot net | Date: | Sun, 04 Dec 2016 15:43:06 +0000 |
| Subject: | Bug #73089 [Com]: SOAP pass dictionary parameter | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-205763@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73089&edit=1
ID: 73089
Comment by: sjon at hortensius dot net
Reported by: matteo dot veggia at gmail dot com
Summary: SOAP pass dictionary parameter
Status: Re-Opened
Type: Bug
Package: SOAP related
Operating System: Windows
PHP Version: 7.1.0
Block user comment: N
Private report: N
New Comment:
@matteo - if the php.exe works then this is probably not a bug in php but in your apache
configuration. You should verify what dll apache uses, check your configuration for the LoadModule
call for php and make sure it looks like this:
LoadModule php7_module "c:/php/php7apache2.dll"
Obviously the php7apache2.dll you reference here should be 7.0.12 or higher. This is also explained
in the "install.txt" that is in the file you download from http://windows.php.net/download
Previous Comments:
------------------------------------------------------------------------
[2016-12-02 12:49:29] matteo dot veggia at gmail dot com
The problem persist.... Please help.
------------------------------------------------------------------------
[2016-11-14 10:45:30] matteo dot veggia at gmail dot com
The issue persists with PHP Version 7.0.13! I rewrite my code to remake the question simplified:
$url = "wwwp.example.com/hello.svc?wdsl";
$options = Array("trace"=>1);
//FIRST METHOD!!! (not working)
$soapClient = new SoapClient($url, $options);
$argsSOAP = new StdClass();
$argsSOAP->Data = Array();
array_push($argsSOAP->Data, Array("Key"=>"A",
"Value"=>"1"));
array_push($argsSOAP->Data, Array("Key"=>"B",
"Value"=>"2"));
$resSOAP = $soapClient->TestRoutineDictionary($argsSOAP);
echo "REQUEST:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $soapClient->__getLastRequest())) . "<br>";
echo "Response:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $soapClient->__getLastResponse())) . "<br>";
echo "\n\n<hr>\n\n";
//SECOND METHOD (working...)
$soapClient2 = new SoapClient($url, $options);
$argsSOAP2 = new StdClass();
$argsSOAP2->Data = Array();
$argsSOAP2->Data[0] = Array("Key"=>"A",
"Value"=>"1");
$argsSOAP2->Data[1] = Array("Key"=>"B",
"Value"=>"2");
$resSOAP2 = $soapClient2->TestRoutineDictionary($argsSOAP2);
echo "REQUEST:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $soapClient2->__getLastRequest())) . "<br>";
echo "Response:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $soapClient2->__getLastResponse())) . "<br>";
I execute this script with php.exe (without apache!)
The results are different!
In the first result is missing "http://schemas.microsoft.com/2003/10/Serialization/Arrays"...
Please help me.
Matteo
------------------------------------------------------------------------
[2016-10-24 14:58:56] matteo dot veggia at gmail dot com
I test with apache and php:
with your test (with some updates):
<?php
$client = new class(null, ['location' => '', 'uri' => 'http://example.org', 'trace' => 1]) extends
SoapClient {
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
//echo $request;
return '';
}
};
$argsSOAP = new StdClass();
$argsSOAP->Data = Array();
array_push($argsSOAP->Data, Array("Key"=>"A",
"Value"=>"1"));
array_push($argsSOAP->Data, Array("Key"=>"B",
"Value"=>"2"));
$res = $client->TestRoutineDictionary($argsSOAP);
echo "REQUEST:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $client->__getLastRequest())) . "<br>";
?>
WORKS!!!!!
BUT
with "my" client:
<?php
$url = "http://mylink.org/myservice.svc?wsdl";
$client = new SoapClient($url, array('trace' => 1));
$argsSOAP = new StdClass();
$argsSOAP->Data = Array();
array_push($argsSOAP->Data, Array("Key"=>"A",
"Value"=>"1"));
array_push($argsSOAP->Data, Array("Key"=>"B",
"Value"=>"2"));
$res = $client->TestRoutineDictionary($argsSOAP);
echo "REQUEST:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $client->__getLastRequest())) . "<br>";
//echo "Response:<br>" . htmlspecialchars(str_ireplace('><',
">\n<", $client->__getLastResponse())) . "<br>";
?>
appears the problem:
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body> <ns1:TestRoutineDictionary> <ns1:Data/>
</ns1:TestRoutineDictionary> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
I await your response
------------------------------------------------------------------------
[2016-10-24 14:45:23] matteo dot veggia at gmail dot com
Your test works!
is Apache environment?
I'm using Apache/2.4.23. What's your suggestions?
------------------------------------------------------------------------
[2016-10-24 14:20:55] nikic@php.net
I just downloaded the PHP 7.0.12 NTS VC14 x64 build from http://windows.php.net/download/ and ran
./php.exe -dextension=
pwd/ext/php_soap.dll test.php
Where test.php contains:
<?php
$client = new class(null, ['location' => '', 'uri' => 'http://example.org']) extends SoapClient {
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
echo $request;
return '';
}
};
$argsSOAP = new StdClass();
$argsSOAP->Data = Array();
array_push($argsSOAP->Data, Array("Key"=>"A",
"Value"=>"1"));
array_push($argsSOAP->Data, Array("Key"=>"B",
"Value"=>"2"));
$client->TestRoutine($argsSOAP);
And received the output:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://example.org" xmlns:ns2="http://xml.apache.org/xml-soap"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:TestRoutine><param0
xsi:type="SOAP-ENC:Struct"><Data SOAP-ENC:arrayType="ns2:Map[2]"
xsi:type="SOAP-ENC:Array"><item xsi:type="ns2:Map"><item><key
xsi:type="xsd:string">Key</key><value
xsi:type="xsd:string">A</value></item><item><key
xsi:type="xsd:string">Value</key><value
xsi:type="xsd:string">1</value></item></item><item
xsi:type="ns2:Map"><item><key
xsi:type="xsd:string">Key</key><value
xsi:type="xsd:string">B</value></item><item><key
xsi:type="xsd:string">Value</key><value
xsi:type="xsd:string">2</value></item></item></Data></param0></ns1:TestRoutine></SOAP-ENV:Body></SOAP-ENV:Enve!
lope>
Which is the expected output.
Which PHP build are you using? Is it a standard windows.php.net build or from some other packager?
To preclude configuration problems, can you check what result you get when running directly from CLI
(w/o server)?
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=73089
--
Edit this bug report at https://bugs.php.net/bug.php?id=73089&edit=1