2

Zend Soap Client インスタンスで適切な SOAP エンベロープを作成するのに苦労しています。

以下は、WSDL ファイルから生成された予期されるエンベロープのサンプルです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                      xmlns:v1="http://coc.gov/xsd/ESB/SupplementalData/V1" 
                      xmlns:ns="http://schemas.calgary.ca/xsd/familycommunitysurvey/2012/08" 
                      xmlns:ns1="http://schemas.calgary.ca/xsd/familycommunitysurveycdm/2012/08">
   <soapenv:Header>
      <v1:SupplementalData>
         <v1:SourceName>CFS</v1:SourceName>
         <v1:ServiceProvider>
            <v1:Name>FamilyCommunitySurvey</v1:Name>
            <v1:OperationName>GetCodeLookupByName</v1:OperationName>
         </v1:ServiceProvider>
         <v1:CorrelationID>23451235634</v1:CorrelationID>
      </v1:SupplementalData>
   </soapenv:Header>

   <soapenv:Body>
      <ns:GetCodeLookupByNameRequest>
         <ns1:Name>Country</ns1:Name>
      </ns:GetCodeLookupByNameRequest>
   </soapenv:Body>
</soapenv:Envelope>

設定する必要があるプロパティは、ヘッダーの「SourceName」、「CorrelationID」、本文の「Name」です。これが私がやっている方法です:

    $fsiiConnect = new Zend_Soap_Client($wsdl, array('soap_version' => SOAP_1_1));

    $fsiiConnect->setLocation($endPoint);
    $fsiiConnect->setHttpLogin($userName);
    $fsiiConnect->setHttpPassword($password);

    $data=array(
       'SourceName' => 'CFS',
       'CorrelationID' => '1234251435632',
       'Name' => 'Country'
   );

   try {
     $results = $fsiiConnect->GetCodeLookupsByName($data);
   }
   catch (Exception $e) {
     print $fsiiConnect->getLastRequest();
   }

getLastRequest() の内容は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
                   xmlns:ns1="http://schemas.calgary.ca/xsd/familycommunitysurveycdm/2012/08" 
                   xmlns:ns2="http://schemas.calgary.ca/xsd/familycommunitysurvey/2012/08">
   <SOAP-ENV:Body>
      <ns2:GetCodeLookupByNameRequest>
         <ns1:Name>Country</ns1:Name>
      </ns2:GetCodeLookupByNameRequest>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

そのため、ヘッダーではなく、本文のオブジェクトにのみプロパティを設定しています。理由があればどんなアイデアでも大歓迎です!

4

1 に答える 1

4

addSoapInputHeaderヘッダーのプロパティを設定するために使用する必要がありました。他のすべては体に行きます。これは少し多段階のプロセスなので、他の誰かが役立つと思った場合に備えて、ここに文書化すると思いました。

1.StdClassを使用してマルチレベル構造を作成します

$headerObj = new StdClass();
$headerObj->ServiceProvider = array(
        'Name'          => 'FamilyCommunitySurvey',
        'OperationName' => 'GetCodeLookupByName'
        );
$headerObj->SourceName = 'foo';
$headerObj->CorrelationID = 'bar';

2. SoapHeaderを使用して、適切なXML構造を作成します

 $header = new SoapHeader('http://coc.gov/xsd/ESB/SupplementalData/V1','SupplementalData',$headerObj);

最初の引数は、WSDLドキュメントで定義されている名前空間です。2番目の引数は最上位の要素です。最後の要素は、フォーマットされたSOAPヘッダーです。

3. addSoapInputHeaderを使用して、ヘッダーをZend_Soap_Clientインスタンスに追加します

$connect->addSoapInputHeader($header);

これを上記のコードと組み合わせると、期待どおりのリクエストが生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
                   xmlns:ns1="http://schemas.calgary.ca/xsd/familycommunitysurveycdm/2012/08" 
                   xmlns:ns2="http://schemas.calgary.ca/xsd/familycommunitysurvey/2012/08" 
                   xmlns:ns3="http://coc.gov/xsd/ESB/SupplementalData/V1">
   <SOAP-ENV:Header>
      <ns3:SupplementalData>
         <ns3:SourceName>CFS</ns3:SourceName>
         <ns3:ServiceProvider>
            <ns3:Name>FamilyCommunitySurvey</ns3:Name>
            <ns3:OperationName>GetCodeLookupByName</ns3:OperationName>
         </ns3:ServiceProvider>
         <ns3:CorrelationID>1352758058</ns3:CorrelationID>
      </ns3:SupplementalData>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
      <ns2:GetCodeLookupByNameRequest>
         <ns1:Name>Country</ns1:Name>
      </ns2:GetCodeLookupByNameRequest>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
于 2012-11-12T22:09:02.357 に答える