I have a php web service API working the last 5 years.
I was asked to dockerize it. So I have setup my docker container.
All the code works fine, except the response my soap server returns.
All the code is the same, nothing has changed but that now the API is running inside docker.
When running the API outside the docker, I get the following response to a soapUI (or curl) :
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://netmedservice.com/soap/executeCommand">
<SOAP-ENV:Body>
<ns1:executeCommandResponse>
<executeCommandResponse>
<ns1:ResponseInfo>
<ns1:MainResponseParams>
<ns1:Attributes>
<ns1:Name>status</ns1:Name>
<ns1:Value>SUCCESS</ns1:Value>
</ns1:Attributes>
</ns1:MainResponseParams>
<ns1:AdditionalResponseParams/>
</ns1:ResponseInfo>
</executeCommandResponse>
</ns1:executeCommandResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
This is the simplest response I can Get.
The same response inside docker is this :
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://netmedservice.com/soap/executeCommand">
<SOAP-ENV:Body>
<ns1:executeCommandResponse>
<executeCommandResponse/>
</ns1:executeCommandResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
As you can see the I have the structure described in the wsdl but from the xsd I only get the the 1st element without data.
In my Code, I tried to debug and see if I have the data.
I have a function that gets the data in array and creates the corresponding soap :
public static function soapEncodeNameValues(array $data, $soapContainer, $ns, $parentName="Attributes", $keyName="Name", $valName="Value") {
$dataStruct = new stdClass();
$paramStruct = new ArrayObject;
foreach ($data as $key => $val) {
error_log("Process Pair key-val : " . trim($key) . " - " . trim($val) . "
");
$dataInStruct = new ArrayObject();
$dataInStruct[] = new SoapVar(trim($key), XSD_STRING, null, null, trim($keyName), $ns);
$dataInStruct[] = new SoapVar(trim($val), XSD_STRING, null, null, trim($valName), $ns);
$paramStruct[] = new SoapVar($dataInStruct, SOAP_ENC_OBJECT, null, null, $parentName, $ns);
}
$dataStruct = new SoapVar($paramStruct, SOAP_ENC_OBJECT, null, null, $soapContainer, $ns);
return $dataStruct;
}
The error_log output is Process Pair key-val : status - SUCCESS
The function that constructs the final soap response and returns it is :
function constructResponse($response) {
$rspObj = new stdClass();
$dataStruct = new ArrayObject;
$dataInStruct = new ArrayObject;
$addParams = new ArrayObject;
$dataInStruct[] = parser::soapEncodeNameValues($response->MainResponseParams, 'MainResponseParams', $this->ns);
if ($response->AdditionalResponseParams !== null) {
foreach ($response->AdditionalResponseParams as $addParam) {
$addParams[] = parser::soapEncodeNameValues($addParam, 'Lines', $this->ns, 'Attributes');
}
$dataInStruct[] = new SoapVar($addParams, SOAP_ENC_OBJECT, null, null, 'AdditionalResponseParams', $this->ns);
} else {
$dataInStruct[] = new SoapVar(null, SOAP_ENC_OBJECT, null, null, 'AdditionalResponseParams', $this->ns);
}
$dataStruct[] = new SoapVar($dataInStruct, SOAP_ENC_OBJECT, null, null, 'ResponseInfo', $this->ns);
$rspObj = new SoapVar($dataStruct, SOAP_ENC_OBJECT, null, null, 'executeCommandResponse', null);
error_log(print_r($rspObj,1));
return $rspObj;
}
The error log for the SOAP encoded above is :
SoapVar Object
(
[enc_type] => 301
[enc_value] => ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[0] => SoapVar Object
(
[enc_type] => 301
[enc_value] => ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[0] => SoapVar Object
(
[enc_type] => 301
[enc_value] => ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[0] => SoapVar Object
(
[enc_type] => 101
[enc_value] => status
[enc_name] => Name
[enc_namens] => http://netmedservice.com/soap/executeCommand
)
[1] => SoapVar Object
(
[enc_type] => 101
[enc_value] => SUCCESS
[enc_name] => Value
[enc_namens] => http://netmedservice.com/soap/executeCommand
)
)
)
[enc_name] => Attributes
[enc_namens] => http://netmedservice.com/soap/executeCommand
)
[enc_name] => MainResponseParams
[enc_namens] => http://netmedservice.com/soap/executeCommand
)
[1] => SoapVar Object
(
[enc_type] => 301
[enc_name] => AdditionalResponseParams
[enc_namens] => http://netmedservice.com/soap/executeCommand
)
)
)
[enc_name] => ResponseInfo
[enc_namens] => http://netmedservice.com/soap/executeCommand
)
)
)
[enc_name] => executeCommandResponse
)
And finally the response in xsd schema is :
<xsd:complexType name="executeCommandResponse">
<xsd:sequence>
<xsd:element name="ResponseInfo" minOccurs="0" maxOccurs="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MainResponseParams" minOccurs="0" maxOccurs="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Attributes" type="exc:AttributesList" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="AdditionalResponseParams" minOccurs="0" maxOccurs="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Lines" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Attributes" type="exc:AttributesList" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
Thank you