3

私は「サービス側の作成」という点でSoapに比較的慣れていないので、私が変更している用語については事前に謝罪します。

PHPのSoapServerクラスを使用してセットアップされたリモートプロシージャSoapサービスからPHP配列を返すことは可能ですか?

私はWSDL(チュートリアルに従って盲目的に作成された)を持っていますが、これは部分的には次のようになります

<message name='genericString'>
    <part name='Result' type='xsd:string'/>
</message>

<message name='genericObject'>
    <part name='Result' type='xsd:object'/>
</message>

<portType name='FtaPortType'>       
    <operation name='query'>
        <input message='tns:genericString'/>
        <output message='tns:genericObject'/>
    </operation>        
</portType>

私が呼び出しているPHPメソッドはqueryという名前で、次のようになります。

public function query($arg){
    $object = new stdClass();
    $object->testing = $arg;
    return $object;     
}

これにより、電話をかけることができます

$client = new SoapClient("http://example.com/my.wsdl");
$result = $client->query('This is a test');

結果のダンプは次のようになります

object(stdClass)[2]
    public 'result' => string 'This is a test' (length=18)

クエリメソッドからネイティブのPHP配列/コレクションを返したい。配列を返すようにクエリメソッドを変更した場合

public function query($arg) {
    $object = array('test','again');
    return $object;
}

クライアント側でオブジェクトにシリアル化されます。

object(stdClass)[2]
    public 'item' => 
        array
            0 => string 'test' (length=4)
            1 => string 'again' (length=5)

xsd:objectこれは、WSDLの結果タイプとしてaを指定したので、理にかなっています。可能であれば、オブジェクトにラップされていないネイティブPHP配列を返したいと思います。私の本能は、これを達成できる特定のxsd:typeがあると言っていますが、わかりません。また、シリアル化されるオブジェクトをとして解決しますArrayObject

WSDLの技術的な詳細で私を教育することをためらわないでください。基礎となる概念を把握しようとしています

4

3 に答える 3

7

ちょっとしたコツ-JSONオブジェクトとしてエンコードし、再帰的な連想配列にデコードして戻します。

$data = json_decode(json_encode($data), true);
于 2013-10-09T19:27:51.970 に答える
3

このWSDLジェネレーターを使用して記述ファイルを作成しました。

文字列の配列を返すことは、私のWebサービスが行うことです。これがWSDLの一部です。

<wsdl:types>
<xsd:schema targetNamespace="http://schema.example.com">
  <xsd:complexType name="stringArray">
    <xsd:complexContent>
      <xsd:restriction base="SOAP-ENC:Array">
        <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

</wsdl:types>
<message name="notifyRequest">
  <part name="parameters" type="xsd:string" />
</message>
<message name="notifyResponse">
  <part name="notifyReturn" type="tns:stringArray" />
</message>

次に、API関数notifyが定義されます。

<wsdl:operation name="notify">
  <wsdl:input message="tns:notifyRequest" />
  <wsdl:output message="tns:notifyResponse" />
</wsdl:operation>
于 2009-07-24T02:00:25.767 に答える
0

アラン、クライアントが応答を受け取ったときにオブジェクトを配列としてキャストしてみませんか?

例えば

(array) $object;

これにより、stdClassオブジェクトが配列に変換されます。これに対する測定可能なオーバーヘッドはなく、PHPではO(1)です。

タイプをxsd:objectからsoap-enc:Arrayに変更してみることもできます。

于 2009-07-23T23:11:11.330 に答える