PHPでSOAPサービスを設定しようとしています。サーバーのphp関数を宣言し、その関数をSOAPタイプのhttpリクエストで呼び出すことができます。ここで、コンテンツは私のSOAPエンベロープです。
SOAP本体のXMLコンテンツは、私が想定している関数の引数ですが、phpコードでその中の情報にアクセスする方法がわかりません。
関数の引数がデフォルトのインスタンスであることに気づきましたが、stdClass
実際には、なぜそれがphpによってXML
またはDOM
オブジェクトにキャストされないのか疑問に思います-それはSOAP呼び出しですよね?しかし、大丈夫です。オブジェクトから情報を取得するのは私次第です。メソッドが割り当てられていないため、これは簡単ではありませんstdClass
。したがって、標準のphp関数である必要があります。だから私は試しserialize
ましたが、これは私が期待したXML文字列ではなく、私にいくつかのゴミを与えました。
何をすべきか?
編集
stdClassオブジェクトから取得するコードを作成する方法がわからないため、以下に実行したいコードの例がないことに注意してください。SOAPリクエストのXMLコンテンツから詳細データを取得します。
デビッドのリクエストに応じて、ここにいくつかの詳細があります。
phpコード:
<?php
function mi102($arg) {
$txt = serialize ($arg);
$result = new SoapVar ($txt, XSD_ANYXML);
return($result);
}
ini_set( "soap.wsdl_cache_enabled", "0");
$server = new SoapServer ("test.wsdl");
$server -> addFunction ("mi102");
try {
$server -> handle();
}
catch (Exception $e) {
$server -> fault ('Client', $e -> getMessage());
}
?php>
httpリクエストは、私が使用するアプリケーションによって作成されます。httpヘッダーとsoapエンベロープ+本文は、フィードしたXMLの周囲に生成されます。
SOAPリクエストの本文の内容:
<mi102 xmlns="http://pse">
<cdhead cisprik="21"/>
<instr>
<insid>
<bcdt>20120930</bcdt>
</insid>
</instr>
</mi102>
使用される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>
<xs:import namespace="http://pse/" schemaLocation="PSE.xsd"/>
</xs:schema>
</types>
<message name="MI102Req">
<part name="cdhead" type="tns:cdhead_T"/>
<part name="instr" type="tns:instr_T"/>
</message>
<message name="Res">
<part name="cdhead" type="tns:cdhead_T"/>
</message>
<portType name="MIPortType">
<operation name="mi102">
<input message="tns:MI102Req"/>
<output message="tns:Res"/>
</operation>
</portType>
<binding name="MIBinding" type="tns:MIPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="mi102">
<soap:operation soapAction="http://testServerURL/test_soap.php#mi102"/>
<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="MIPortType" binding="tns:MIBinding">
<soap:address location="http://testServerURL/test_soap.php"/>
</port>
</service>
</definitions>
そして、結果のXML(ここでも、私が使用するアプリケーションによってSOAP本体から抽出されます)は次のようになります。
SOAP応答:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:mi102Response xmlns:ns1="http://pse/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">O:8:"stdClass":2:{s:7:"cisprik";i:21;s:7:"version";s:2:"13";}</ns1:mi102Response>
よくない。