2009-07-23 6 views
3

Ich bin relativ neu in Soap auf der "Erstellung der Service-Seite", also im Voraus für jede Terminologie, die ich Munging.Ein PHP-Array von einem PHP-SoapServer zurückgeben

Ist es möglich, ein PHP-Array von einem Remote Procedure Soap Service, der mit der SoapServer-Klasse von PHP eingerichtet wurde, zurückzugeben?

Ich habe eine WSDL (gebaut von blind zu folgen ein Tutorial), die zum Teil etwas wie diese Methode Ich rufe

<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> 

Die PHP sieht Abfrage genannt wird, und sieht so etwas wie dieses

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

Dies ermöglicht es mir

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

und Dump Ergebnis wie etwas aussehen zu nennen

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

Ich möchte eine native PHP-Array/Sammlung von meiner Abfrage-Methode zurückgeben. Wenn ich meine Abfragemethode ändere, um ein Array zurückzugeben

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

Es ist serialisiert in ein Objekt auf der Clientseite.

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

Dies macht Sinn, wie ich in meinem WSDL ein xsd:object als Ergebnistyp spezifisch haben. Ich möchte, wenn möglich, ein natives PHP-Array zurückgeben, das nicht in ein Objekt eingebettet ist. Mein Instinkt sagt, dass es einen spezifischen xsd: -Typ gibt, der mich das erreichen lässt, aber ich weiß es nicht. Ich würde mich auch damit begnügen, dass das Objekt als ArrayObject serialisiert wird.

Halten Sie sich nicht zurück, mich in den technischen Details WSDL zu schulen. Ich versuche, ein Verständnis für die zugrunde liegenden Konzepte zu bekommen

Antwort

2

Ich habe this WSDL generator verwendet, um eine Beschreibungsdatei zu erstellen.

Zurückgeben Array von Strings ist etwas, was meine Web-Service tut, hier Teil der WSDL ist:

<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> 

Dann notify API-Funktion definiert:

<wsdl:operation name="notify"> 
    <wsdl:input message="tns:notifyRequest" /> 
    <wsdl:output message="tns:notifyResponse" /> 
</wsdl:operation> 
0

Alan, warum nicht Ihr Objekt als Array zu werfen, wenn Ihr Client die Antwort erhält?

z.B.

(array) $object; 

Diese Ihre stdClass Objekt in ein Array umwandeln wird, gibt es keine messbare Overhead dazu und ist O (1) in PHP.

Sie können auch versuchen, den Typ von xsd: object in soap-enc: Array zu ändern.

+1

Zwei Gründe.Weil das mir ein Array mit einem einzelnen Schlüssel namens "item" geben würde, der mein Array enthält, und noch wichtiger, ich möchte einen Service erstellen, den Endbenutzer verwenden können und ein Array zurückbekommen, ohne es zu casten. –

+0

Und Seife-Enc: Array nicht Ihren Bedürfnissen entsprechen? – hobodave

+3

Beachten Sie jedoch, dass dies nicht rekursiv konvertiert wird. Wenn Sie das Objekt stdClass in tieferen Ebenen Ihrer Antwort haben, werden sie nicht konvertiert. In diesem Fall denke ich nur an Lubosdz 'Antwort. – flu

5

Kleiner Trick - kodieren als JSON-Objekte, Dekodieren zurück in rekursive assoziative Arrays:

$data = json_decode(json_encode($data), true); 
+0

Schon davon gewusst, aber Sie haben mich an den richtigen Ort erinnert! Vielen Dank :-) – Forbesmyester