2013-03-08 19 views
16

PHPを使用してSOAPメソッドを呼び出そうとしています。XML本体でPHPを使用してSOAP呼び出しを作成する

ここで私が持っているコードです:

$data = array('Acquirer' => 
    array(
    'Id' => 'MyId', 
    'UserId' => 'MyUserId', 
    'Password' => 'MyPassword' 
)); 
$method = 'Echo'; 
$client = new SoapClient(NULL, 
      array('location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
      'uri' => 'http://example.com/wsdl', 'trace' => 1)); 
$result = $client->$method($data); 

はここで、作成したリクエストです:

<?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <Echo> 
     <Acquirer> 
      <Id>MyId</Id> 
      <UserId>MyUserId</UserId> 
      <Password>MyPassword</Password> 
     </Acquirer> 
     </Echo> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

<?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <ns1:Echo> 
     <param0 xsi:type="ns2:Map"> 
      <item> 
      <key xsi:type="xsd:string">Acquirer</key> 
      <value xsi:type="ns2:Map"> 
       <item> 
       <key xsi:type="xsd:string">Id</key> 
       <value xsi:type="xsd:string">mcp</value> 
       </item> 
       <item> 
       <key xsi:type="xsd:string">UserId</key> 
       <value xsi:type="xsd:string">tst001</value> 
       </item> 
       <item> 
       <key xsi:type="xsd:string">Password</key> 
       <value xsi:type="xsd:string">test</value> 
       </item> 
      </value> 
      </item> 
     </param0> 
     </ns1:Echo> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

そして、ここでは、私は要求が見えるようにしたいものだが、

+1

これは完全なWSDL情報が利用可能でなければ解決できません。 PHP SoapClientは、WSDLを積極的に解析して使用し、関数の引数を適切な場所に配置します。 WSDLがロードされていないと、動作するものを作成することはほとんど不可能です。 – Sven

+0

@Sven - それは私の問題を完全には解決しなかったけれども、非常に役に立ちました。回答として投稿できますか?他に誰も反応しないなら、私はそれを受け入れてくれます。 – greggles

+0

いいえ、ありがとう、あなたは恩恵に値するかもしれないより良い答えを得ました。 – Sven

答えて

41

これを解決するにはいくつかの方法があります。少なくともhackiestほとんどあなたが欲しいもの:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/wsdl"> 
    <SOAP-ENV:Body> 
     <ns1:Echo> 
      <Acquirer> 
       <Id>MyId</Id> 
       <UserId>MyUserId</UserId> 
       <Password>MyPassword</Password> 
      </Acquirer> 
     </ns1:Echo> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

メソッド名の名前空間を除いて、ほぼ正確に何をしたいです:

$client = new SoapClient(
    null, 
    array(
     'location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
     'uri' => 'http://example.com/wsdl', 
     'trace' => 1, 
     'use' => SOAP_LITERAL, 
    ) 
); 
$params = new \SoapVar("<Acquirer><Id>MyId</Id><UserId>MyUserId</UserId><Password>MyPassword</Password></Acquirer>", XSD_ANYXML); 
$result = $client->Echo($params); 

これはあなたに次のXMLを取得します。これが問題なのかどうかわかりません。もしそうなら、あなたはさらにそれをハックすることができます。あなたは手でXML文字列に<Echo>タグを入れてのSoapClientは、このようなオプションの配列に'style' => SOAP_DOCUMENT,を追加する方法を設定していないかもしれない:

これは、次の要求XMLになり
$client = new SoapClient(
    null, 
    array(
     'location' => 'https://example.com/ExampleWebServiceDL/services/ExampleHandler', 
     'uri' => 'http://example.com/wsdl', 
     'trace' => 1, 
     'use' => SOAP_LITERAL, 
     'style' => SOAP_DOCUMENT, 
    ) 
); 
$params = new \SoapVar("<Echo><Acquirer><Id>MyId</Id><UserId>MyUserId</UserId><Password>MyPassword</Password></Acquirer></Echo>", XSD_ANYXML); 
$result = $client->MethodNameIsIgnored($params); 

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <Echo> 
      <Acquirer> 
       <Id>MyId</Id> 
       <UserId>MyUserId</UserId> 
       <Password>MyPassword</Password> 
      </Acquirer> 
     </Echo> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

最後に、SoapVarオブジェクトとSoapParamオブジェクトを使いたい場合は、このマニュアルのPHPマニュアルのhttp://www.php.net/manual/en/soapvar.soapvar.php#104065を参照してください。あなたがそれを働かせたら、私に知らせてください、私は惨めに失敗しました。

8

まず第一に、あなたはドキュメントリテラルスタイルを使用するかを指定する必要があります。そして、

$client = new SoapClient(NULL, array(
    'location' => 'https://example.com/path/to/service', 
    'uri' => 'http://example.com/wsdl', 
    'trace' => 1, 
    'use' => SOAP_LITERAL) 
); 

を、あなたはSoapVarにデータを変換する必要があります。あなたのデータへの変換関数を使用すると、これを適用し、その後

function soapify(array $data) 
{ 
     foreach ($data as &$value) { 
       if (is_array($value)) { 
         $value = soapify($value); 
       } 
     } 

     return new SoapVar($data, SOAP_ENC_OBJECT); 
} 

:私は、単純な変換関数を書いた

$data = soapify(array(
    'Acquirer' => array(
     'Id' => 'MyId', 
     'UserId' => 'MyUserId', 
     'Password' => 'MyPassword', 
    ), 
)); 

は最後に、あなたはDataパラメータを渡すサービスを呼び出す:

$method = 'Echo'; 

$result = $client->$method(new SoapParam($data, 'Data')); 
+0

これは実際には "データ"パラメータについて述べたstackoverlowの最初の投稿です –

関連する問題