Hallo,
ich möchte einen eigenen Webservice unter php5/SOAP aufsetzen. WSDL ist erstellt und funzt soweit. Ich möchte Arrays verwenden. Hier meine Operation und ComplexType in der WSDL-Datei:
Wie hieraus zu erkennen ist habe ich eine Funktion (getAllSites).
Ich benötige nun ja logischerweise eine PHP-Funktion, welche mir die Daten aus der Datenbank liest und entsprechend des Schemas der WSDL-Datei zurückgibt. Aus dieser Rückgabe und des WSDL-Schemas kann der Client - in meinem Falle JAVA - auf den Response-Code zugreifen und die entsprechenden Rückgaben verarbeiten.
Mein Problem ist, das ich es nicht schaffe einen PHP-Code zu schreiben, der ungefähr dieses Response-XML ausgibt.
Die DB-Abfrage ist natürlich nicht das Problem. Es geht darum, PHP5 mit SoapVars und Schleifen und Arrays/Objekten zu bewegen, die korrekte XML-Response zu erzeugen.
Wenn alles PHP-Intern ablaufen würde wäre alles kein Problem, da ich hier einfach ein Array zurückgeben und dieses im Client direkt weiterverarbeiten kann. Java hat sich da aber etwas eigensinniger.
Leider ist dieses Thema IMHO absolut unterdokumentiert und man findet kaum etwas im Netz außer den obligatorischen Klassendefinitionen.
Ich hoffe mir kann hier jemand weiterhelfen.
Viele Grüße
Micha
ich möchte einen eigenen Webservice unter php5/SOAP aufsetzen. WSDL ist erstellt und funzt soweit. Ich möchte Arrays verwenden. Hier meine Operation und ComplexType in der WSDL-Datei:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="shopAPI" targetNamespace="http://localhost/shopapp/info"
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost/shopapp/info"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost/shopapp/info">
<xsd:complexType name="AllSiteList">
<xsd:all>
<xsd:element name="AllSiteListElements" type="tns:AllSiteListElementArray" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="AllSiteListElementArray">
<xsd:complexContent>
<xsd:restriction base="soapenc:Array">
<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:AllSiteListElement[]" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="AllSiteListElement">
<xsd:all>
<xsd:element name="idSite" type="tns:IDSite" />
<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="IDSite">
<xsd:attribute name="idSite" type="int" use="required"></xsd:attribute>
</xsd:complexType>
</wsdl:types>
<wsdl:message name="getAllSitesResponse">
<wsdl:part name="getAllSitesResponse" type="tns:AllSiteList" />
</wsdl:message>
<wsdl:message name="getAllSitesRequest"></wsdl:message>
<wsdl:message name="Dummy"></wsdl:message>
<wsdl:portType name="shopAPI">
<wsdl:operation name="getAllSites">
<wsdl:input message="tns:Dummy" />
<wsdl:output message="tns:getAllSitesResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="shopAPISOAP" type="tns:shopAPI">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getAllSites">
<soap:operation soapAction="shopAPI/getAllSites" />
<wsdl:output>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="shopAPI" parts=" getAllSitesResponse" use="encoded" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="shopAPI">
<wsdl:port binding="tns:shopAPISOAP" name="shopAPISOAP">
<soap:address
location="http://localhost/ws/server.php" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Wie hieraus zu erkennen ist habe ich eine Funktion (getAllSites).
Ich benötige nun ja logischerweise eine PHP-Funktion, welche mir die Daten aus der Datenbank liest und entsprechend des Schemas der WSDL-Datei zurückgibt. Aus dieser Rückgabe und des WSDL-Schemas kann der Client - in meinem Falle JAVA - auf den Response-Code zugreifen und die entsprechenden Rückgaben verarbeiten.
Mein Problem ist, das ich es nicht schaffe einen PHP-Code zu schreiben, der ungefähr dieses Response-XML ausgibt.
Code:
<?xml version="1.0" encoding="ISO-8859-1"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:getAllSitesResponse> <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType=":AllSiteListElement[2]"> <item xsi:type=":AllSiteListElement"> <idShop xsi:type="xsd:int">79424</idShop> <name xsi:type="xsd:int">ShopA</name> </item> <item xsi:type=":AllSiteListElement"> <idShop xsi:type="xsd:int">79428</idShop> <name xsi:type="xsd:int">ShopB</name> </item> </return> </ns1:getAllSitesResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Die DB-Abfrage ist natürlich nicht das Problem. Es geht darum, PHP5 mit SoapVars und Schleifen und Arrays/Objekten zu bewegen, die korrekte XML-Response zu erzeugen.
Wenn alles PHP-Intern ablaufen würde wäre alles kein Problem, da ich hier einfach ein Array zurückgeben und dieses im Client direkt weiterverarbeiten kann. Java hat sich da aber etwas eigensinniger.
Leider ist dieses Thema IMHO absolut unterdokumentiert und man findet kaum etwas im Netz außer den obligatorischen Klassendefinitionen.
Ich hoffe mir kann hier jemand weiterhelfen.
Viele Grüße
Micha

Kommentar