Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
144 views
in Technique[技术] by (71.8m points)

php soap server inside docker does not return response


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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

After a lot of testing and searching, the problem is solved.

It was not the docker, it had to do with the docker's php version which is 7.4 I found the same problem here and is answered but I found it a little bit late


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...