2011-09-27 25 views
5

Hola Tengo que escribir un servidor SOAP, donde me gustaría ser capaz de pasar los tipos complejos, structuraly que se vería así:¿Cómo establecer estos tipos complejos en ZEND SOAP AutoDiscovery?

<ParcelDetails> 
    <countryType></countryType> 
    <addressType> 
    <countryType></countryType> 
     .... ..... 
     .... .... 

    <contact></contact> 
    </addressType> 
<ParcelDetails> 

y yo/m usando siguiente código para generar el archivo WSDL para este servicio

<?php 
include_once("Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence.php"); 
include_once("Zend/Soap/Wsdl/Strategy/DefaultComplexType.php"); 
include_once("Zend/Soap/Wsdl/Strategy/Composite.php"); 
include_once("Zend/Soap/Wsdl/Strategy/ArrayOfTypeComplex.php"); 
include_once("Zend/Soap/Wsdl/Strategy/AnyType.php"); 
include_once('Zend/Soap/AutoDiscover.php'); 

include_once('Zend/Soap/Server.php'); 
include_once('Zend/Soap/Client.php'); 
include_once('Zend/Soap/Wsdl.php'); 

//************************************* 
// Classes used by getGroup service method below 

class countryTypeSpace 
{ 
    /** @var country */ 
    public $country = ''; 
} 

class addressTypeSpace 
{ 
    /** @var countryType */ 
    public $countryType = ''; 

    .... 

    /** @var contact */ 
    public $contact = ''; 

} 



class ParcelDetailsSpace 
{ 

    /** @var countryType */ 
    public $countryType; 

    /** @var addressType[] */ 
    public $addressType; 

} 

//************************************* 

class ServiceClass 
{ 
    /** 
    * ParcelDetails 
    */ 
    public function registerParcel($username, $pasword) { 

     $group = new ParcelDetailsSpace(); 

     //fill in the array 
     for ($i = 1; $i <= 3; $i++) { 
      $countryType = new countryType(); 
      $countryType->country = 'country'; 

      $addressType = new addressTypeSpace(); 
      $addressType->address = 'Adresas'; 
      $addressType->area = 'Area'; 


      $group->countryType = $countryType; 
      $group->addressType = $addressType; 
     } 

     return $group; 
    }  
} 


if(isset($_GET['wsdl'])) { 
    $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_AnyType'); 
    $autodiscover->setClass('ServiceClass'); 
    $autodiscover->handle(); 
} else { 
    $soap = new Zend_Soap_Server("http://localhost/zs/zserverComplex.php?wsdl"); 
    $soap->setClass('ServiceClass'); 
    $soap->handle(); 
} 

?> 

en el cliente final Recibo un error:

Fatal error: Uncaught SoapFault exception: [VersionMismatch] Wrong 
Version in C:\Program Files 
(x86)\EasyPHP-5.3.8.0\www\zs\Zend\Soap\Client.php:1121 Stack trace: 

# 0 C:\Program Files 
(x86)\EasyPHP-5.3.8.0\www\zs\Zend\Soap\Client.php(1121): 
SoapClient->__soapCall('registerParcel', Array, NULL, NULL, Array) 

# 1 C:\Program Files (x86)\EasyPHP-5.3.8.0\www\zs\zclientDpd.php(6): 
Zend_Soap_Client->__call('registerParcel', Array) 

#2 C:\Program Files 
(x86)\EasyPHP-5.3.8.0\www\zs\zclientDpd.php(6): 
Zend_Soap_Client->registerParcel(Array) 

#3 {main} thrown in C:\Program Files 
(x86)\EasyPHP-5.3.8.0\www\zs\Zend\Soap\Client.php on line 1121 

Me'v trató diferentes estrategias Zend_Soap_Wsdl_Strategy como se puede ver incluye en la parte superior del archivo del servidor, pero no tiene éxito en absoluto Sé que probablemente me falta algo, pero no estoy seguro de dónde buscar ...

Estaría encantado de que alguien fuera capaz de apuntar a la dirección correcta, sobre estos tipos complejos y la detección automática, por lo menos, si no es la respuesta correcta a este problema

Debido a que no pude conseguir ninguna buena información sobre este

Gracias de antemano

Respuesta

1

Podría estar fuera de mi alcance aquí, pero acabo de escribir un servicio web en PHP usando NuSOAP, y me permite s usted para definir tipos complejos y genera el WSDL por usted.

podría ser algo de revisar: http://www.scottnichol.com/nusoapintro.htm

En NuSOAP, para crear un tipo complejo como el que se ha proporcionado, el código sería algo como esto:

$server = new nusoap_server(); 

$server->wsdl->addComplexType(
    "addressType", 
    "complexType", 
    "struct", 
    "all", 
    "", 
    array(
     "countryType" => array("name" => "countryType", "type" => "xsd:string"), 
     ... 
     "contact" => array("name" => "contact", "type" => "xsd:string") 
    ) 
); 

$server->wsdl->addComplexType(
    "ParcelDetails", 
    "complexType", 
    "struct", 
    "all", 
    "", 
    array(
     "countryType" => array("name" => "countryType", "type" => "xsd:string"), 
     "addressType" => array("name" => "addressType", "type" => "tns:addressType") 
    ) 
); 
Cuestiones relacionadas