Hallo Zusammen,
ich versuche jetzt schon zwei Tage lang, einen PHP Webservice zu schreiben, dem ich ein Objektarray übergeben kann.
Ziel ist es einfach eine unbekannte Menge an Objekten mit einer Anfrage weg zu schicken und nicht für jedes Objekt eine einge Anfrage zu erzeugen
Der Client ist jetzt noch PHP soll später aber mit C# verwirklicht werden.
Der ServerCode:
PHP-Code:
function sendData($object){
return "hallo";
//return insertRecord($objects[0]);
}
$server = new SoapServer(NULL,
array('uri' => "http://localhost/soap_demo"));
$server->addFunction('sendData');
$server->handle();
Der Client:
PHP-Code:
class GpsData{
var $log_date;
var $phone_id;
var $day_id;
var $tour_id;
var $drive_id;
var $craft_id;
var $hanger_id;
var $action_id;
var $workstate_id;
var $x_coordiante;
var $y_coordiante;
var $speed;
}
$gps1 = &new GpsData();
$gps1->log_date = time();
$gps1->phone_id = "018";
$gps1->day_id = 1;
$gps1->tour_id = 4;
$gps1->drive_id = 7;
$gps1->craft_id = 4;
$gps1->hanger_id = 4;
$gps1->action_id = 5;
$gps1->workstate_id = 1;
$gps1->x_coordiante = 50.01451571;
$gps1->y_coordiante = 11.78505541;
$gps1->speed = 60;
$gps2 = &new GpsData();
$gps2->log_date = time();
$gps2->phone_id = "017";
$gps2->day_id = 1;
$gps2->tour_id = 4;
$gps2->drive_id = 7;
$gps2->craft_id = 4;
$gps2->hanger_id = 4;
$gps2->action_id = 5;
$gps2->workstate_id = 1;
$gps2->x_coordiante = 50.01451571;
$gps2->y_coordiante = 11.78505541;
$gps2->speed = 60;
$gpsarray = array($gps1,$gps2);
//$result = $client->sendData($gpsarray);
$result = $client->__call("sendData",$gpsarray);
echo $result;
Die WSDL
HTML-Code:
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='TestServer'
xmlns:tns=' http://localhost/soap_demo/server.wsdl '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'
xmlns:icns="http://www.test.namespace">
<wsdl:types>
<xsd:schema elementFormDefault="unqualified" targetNamespace="http://www.test.namespace">
<xsd:complexType name="gpsData">
<xsd:sequence>
<xsd:element name="log_date" type="xsd:dateTime"/>
<xsd:element name="phone_id" type="xsd:string"/>
<xsd:element name="day_id" type="xsd:int"/>
<xsd:element name="tour_id" type="xsd:int"/>
<xsd:element name="drive_id" type="xsd:int"/>
<xsd:element name="craft_id" type="xsd:int"/>
<xsd:element name="hanger_id" type="xsd:int"/>
<xsd:element name="action_id" type="xsd:int"/>
<xsd:element name="workstate_id" type="xsd:int"/>
<xsd:element name="x_coordiante" type="xsd:float"/>
<xsd:element name="y_coordiante" type="xsd:float"/>
<xsd:element name="speed" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfGpsData">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="item" type="icns:gpsData"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="gpsDatas">
<xsd:sequence>
<xsd:element name="gpsDatas" type="icns:ArrayOfGpsData"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<message name='connectRequest'>
<part name='a' type='xsd:string'/>
<part name='b' type='xsd:string'/>
</message>
<message name='connectResponse'>
<part name='Result' type='xsd:string'/>
</message>
<message name='sendDataRequest'>
<part name='objects' type='icns:gpsDatas'/>
</message>
<message name='sendDataResponse'>
<part name='Result' type='xsd:string'/>
</message>
<portType name='TestServerPortType'>
<operation name='connect'>
<input message='tns:connectRequest'/>
<output message='tns:connectResponse'/>
</operation>
<operation name='sendData'>
<input message='tns:sendDataRequest'/>
<output message='tns:sendDataResponse'/>
</operation>
</portType>
<binding name='TestServerBinding' type='tns:TestServerPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='connect'>
<soap:operation soapAction='urn:xmethodsTestServer#connect'/>
<input>
<soap:body use='encoded' namespace='urn:xmethodsTestServer'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethodsTestServer'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
<operation name='sendData'>
<soap:operation soapAction='urn:xmethodsTestServer#sendData'/>
<input>
<soap:body use='encoded' namespace='urn:xmethodsTestServer'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethodsTestServer'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<service name='TestServerService'>
<port name='TestServerPort' binding='TestServerBinding'>
<soap:address location='http://localhost/soap_demo/server.php'/>
</port>
</service>
</definitions> und zu guter letzt die Fehlermeldung:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'gpsDatas' property in C:\Arbeit\xampplite\htdocs\soap_demo\client.php:85 Stack trace: #0 C:\Arbeit\xampplite\htdocs\soap_demo\client.php(85 ): SoapClient->__call('sendData', Array) #1 {main} thrown in C:\Arbeit\xampplite\htdocs\soap_demo\client.php on line 85
ich weiß jetzt echt nicht mehr weiter, hab grade 3 Stunden gegoogelt aber keine funktionierende Lösung gefunden. Das muss doch gehen
Ich hoffe jemand von euch hat einen Tipp für mich