複合メッセージを返す SOAP Web サービスをセットアップしています。
このメッセージの有効な例は次のとおりです。
<dl190Response xmlns="http://pse/">
<cdhead cisprik="5563167"/>
<mvts>
<mvts_S att="a1">
<x>x1</x>
<w>w1</w>
</mvts_S>
<mvts_S>
<x>x2</x>
<w>w2</w>
</mvts_S>
</mvts>
</dl190Response>
これはすべて wsdl できちんと定義されています。
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://pse/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="PSE"
targetNamespace="http://pse/">
<types>
<xs:schema xmlns="http://pse/" targetNamespace="http://pse/">
<xs:complexType name="cdhead_T">
<xs:attribute name="cisprik" type="xs:long"/>
</xs:complexType>
<xs:complexType name="mvts_T">
<xs:sequence>
<xs:element name="mvts_S" type="mvts_S_T" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mvts_S_T">
<xs:sequence>
<xs:element name="x" type="xs:string"/>
<xs:element name="w" type="xs:string"/>
</xs:sequence>
<xs:attribute name="att" type="xs:string" use="optional"/>
</xs:complexType>
</xs:schema>
</types>
<message name="DL190Req">
<part name="cdhead" type="tns:cdhead_T"/>
</message>
<message name="DL190Res">
<part name="cdhead" type="tns:cdhead_T"/>
<part name="mvts" type="tns:mvts_T"/>
</message>
<portType name="DLPortType">
<operation name="dl190">
<input message="tns:DL190Req"/>
<output message="tns:DL190Res"/>
</operation>
</portType>
<binding name="DLBinding" type="tns:DLPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="dl190">
<soap:operation soapAction="http://www.testServer.com/test_soap.php#dl190"/>
<input>
<soap:body use="literal" namespace="http://pse/"/>
</input>
<output>
<soap:body use="literal" namespace="http://pse/"/>
</output>
</operation>
</binding>
<service name="PSE">
<port name="DLPortType" binding="tns:DLBinding">
<soap:address location="http://www.testServer.com/test_soap.php"/>
</port>
</service>
</definitions>
私はサーバー側の test_soap.php を際限なく正しくするために取り組んできましたが、成功しません。XML を返す時点まで正常に動作しているものの一部は次のとおりです。
<?php
class PSE {
function dl190 ($arg) {
//I don't need to extract the input data just now
mysql_connect('127.0.0.1:3306', 'user', 'password');
mysql_select_db('myDatabase');
$xml = new SimpleXMLElement('<dl190Res/>');
$xml -> addChild('cdhead');
$mvts = $xml -> addChild('mvts');
$rows = mysql_query('select * from trx');
while($data = mysql_fetch_assoc($rows)) {
$mvts_S = $mvts -> addChild('mvts_S');
foreach($data as $key => $value) {
if ($key == 'att') { $mvts_S -> addAttribute($key, $value);}
else {$mvts_S -> addChild($key, $value);}
}
};
$dom = dom_import_simplexml ($xml) -> ownerDocument;
// now respond to the request and return the XML
}
};
ini_set( "soap.wsdl_cache_enabled", "0");
$server = new SoapServer ("test.wsdl");
$server -> setClass ('PSE');
$server -> setObject (new PSE());
$server -> handle();
?>
適切な応答を得るために考えられることはほぼすべて試しましたが、うまくいきませんでした。以前の一部のみを含むメッセージに対して同じことを行うことができました (私の最新の質問と回答を参照してください)。
しかし、ここでは 2 つのメッセージ部分があるため、成功しません。
$xml コンテンツのデバッグは、SOAP サーバーがエンベロープ + ボディにそれをラップさせた後、まさに私が見たいと思っていたものであることを示しています。
実際には、メッセージ部分が 1 つだけの場合とは状況が異なります。最初に XML 宣言を取り除いて、それを返す限り、メッセージ部分から新しい SoapVar を作成できます。ここでは、戻り値が 2 つの部分で構成されているため、同じことはできません。
だから、私は今、次のうちどれをやるべきか疑問に思っています。
- 応答メッセージのクラスを宣言し、それを入力して返します
- SoapVar および/または SoapParam でいくつかの魔法を実行します (注意してください、私はすでに多くのことを試しました)
- 配列と SoapVar を使っていくつかの魔法を実行します (すでに多くのことを試しました)
- どういうわけか (どのように?) wsdl に助けを求める
- まったく違うもの
- SoapServer でこの悪夢全体を終了し、独自の http 応答をゼロから作成します
これについてのすべての助けに感謝しますので、すべての石けんの専門家は、この質問に答えることを躊躇しないでください!
添加
一時的な回避策として、WSDL を編集し、応答メッセージを 1 つの部分だけに変更しました。これにより、予想される 2 つの部分の連結として予想されるメッセージを渡すことができました (または、返された値に対して SoapVar によって定義された構造の WSDL チェックが行われていないため、その他のメッセージも同様です)。
$xml1 = new SimpleXMLElement('<cdhead/>');
$xml1 -> addAttribute ('xmlns', 'http://pse/');
$xml1 -> addAttribute ('cisprik', $newCisprik);
$xml2 = new SimpleXMLElement('<mvts/>');
$rows = mysql_query('select * from trx');
while($data = mysql_fetch_assoc($rows)) {
$mvts_S = $xml2 -> addChild('mvts_S');
foreach($data as $key => $value) {
if ($key == 'att') { $mvts_S -> addAttribute($key, $value);}
else {$mvts_S -> addChild($key, $value);}
}
};
$dom1 = dom_import_simplexml ($xml1) -> ownerDocument;
$dom2 = dom_import_simplexml ($xml2) -> ownerDocument;
$part1 = $dom1 -> saveXML($dom1 -> documentElement);
$part2 = $dom2 -> saveXML($dom2 -> documentElement);
$result = new SoapVar ($part1 . $part2, XSD_ANYXML);
これに関する奇妙な点は、もちろん、連結が有効な XML ではなく、周囲のルート要素が欠けていることですが、SoapVar はとにかくそれを解析できます。
SoapVar と SoapParam / SoapServer の詳細な洞察を持っている人は、2 つのメッセージ部分を返すことが可能かどうかを説明できますか?
そして、その方法を説明しますか?
または、代わりに、他の SOAP 設定でそれを行う方法について詳細な情報を提供してください。