2009-06-17 5 views

Répondre

0

Papa Google me pointe à Zend article avec beaucoup de bons exemples sur les aspects client et serveur du travail avec Soap (en particulier l'implémentation de PHP5). On dirait un bon point de départ. Si vous êtes un peu comme moi, et que vous hésitez à écrire manuellement un WSDL, je vous recommande d'utiliser WSHelper, qui utilise les classes de réflexion de PHP pour générer dynamiquement un WSDL pour vous. Un gain de temps incontestable

1

Fondamentalement, vous devez créer une carte de classe et la passer à votre client de savon. Oui c'est une douleur. Habituellement, j'ai juste une méthode qui mappe le nom de l'objet Soap aux objets PHP (c'est-à-dire Person => MY_Person) et ne code que ceux dont j'ai besoin à la main (c'est-à-dire createdOn => DateTime).

class MY_WSHelper 
{ 
    protected static $ws_map; 
    public static function make_map() 
    { 
    if(! self::$ws_map) 
    { 
     self::$ws_map = array(); 
     //These will be mapped dynamically 
     self::$ws_map['Person'] = NULL; 
     self::$ws_map['Animal'] = NULL; 
     //Hard-coded type map 
     self::$ws_map['createdOn'] = DateTime; 
     self::$ws_map['modifiedOn'] = DateTime; 

     foreach(self::$ws_map as $soap_name => $php_name) 
     { 
     if($php_name === NULL) 
     { 
      //Map un-mapped SoapObjects to PHP classes 
      self::$ws_map[$soap_name] = "MY_" . ucfirst($soap_name); 
     } 
     } 
    } 
    return self::$ws_map; 
    } 
} 

Client:

$client = new SoapClient('http://someurl.com/personservice?wsdl', 
    array('classmap' => MY_WSHelper::make_map())); 

$aperson = $client->getPerson(array('name' => 'Bob')); 
echo get_class($aperson); //MY_Person 
echo get_class($aperson->createdOn); //DateTime 

http://php.net/manual/en/soapclient.soapclient.php

2

J'utilise Zend_Soap_Server Zend_Soap_Client Ø. J'envoie/reçois un tableau de structure difficile.

Créez d'abord une classe avec la structure que vous voulez recevoir.

<?php 

/** 
* Information about people 
*/ 
class PeopleInformation 
{ 
    /** 
    * Name of ... 
    * 
    * @var string 
    */ 
    public $name; 

    /** 
    * Age of 
    * @var int 
    */ 
    public $age; 

    /** 
    * Array of family 
    * 
    * @var FamilyInformation[] 
    */ 
    public $family; 
} 

/** 
* Information about his family 
*/ 
class FamilyInformation 
{ 
    /** 
    * Mother/sister/bro etc 
    * 
    * @var string 
    */ 
    public $relation; 

    /** 
    * Name 
    * @var string 
    */ 
    public $name; 
} 

?> 

Ensuite, créez un service pour recevoir ces données:

<?php 

/** 
* Service to receive SOAP data 
*/ 
class SoapService 
{ 
    /** 
    * 
    * @param PeopleInformation $data 
    * @return string 
    */ 
    public function getUserData($data) 
    { 
     //here $data is object of PeopleInformation class 


     return "OK"; 
    } 
} 
?> 

Maintenant, créer une instance Zend_Soap_Server dans le contrôleur par url http://ourhost/soap/:

<?php 

//disable wsdl caching 
ini_set('soap.wsdl_cache_enabled', 0); 
ini_set('soap.wsdl_cache', 0); 

$wsdl = $_GET['wsdl']; 

//this generate wsdl from our class SoapService 
if (!is_null($wsdl)) 
{ 
    $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence'); 
    $autodiscover->setClass('SoapService'); 
    $autodiscover->handle(); 
} 
//handle all soap request 
else 
{ 
    $wsdlPath = 'http://ourhost/soap/?wsdl'; 

    $soap = new Zend_Soap_Server($wsdlPath, array(
     'cache_wsdl' => false 
    )); 
    $soap->registerFaultException('Zend_Soap_Server_Exception'); 
    $soap->setClass('SoapService'); 
    $soap->handle(); 
} 

?> 

Et maintenant, vous obtenez wsdl (http: // ourhost/soap /? wsdl) avec votre demande de structure et de handle dans SoapService :: getUserData. L'entrée parametr dans cette méthode est l'objet de PeopleInformation class

0

Je rejoue pour partager ma (mauvaise) expérience.

J'ai créé un webservice en utilisant PHP ZendFramework2 (ZF2).

Objets de réponse du serveur et tableau d'objets, et jusqu'à ce qu'il prenne une chaîne en entrée, cela a bien fonctionné. J'utilisais la stratégie ArrayOfTypeComplex.

$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex(); 

Lorsque je tente d'utiliser un tableau de chaîne comme entrée dans je ressentais une vallée sombre et malheureuse jusqu'à ce que je trouve la réponse de Ramil, donc je changer de stratégie et de travailler tout droit!

$_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence(); 

if (isset($_GET['wsdl'])) { 
    $autodiscover = new \Zend\Soap\AutoDiscover($_strategy); 
    $autodiscover->setBindingStyle(array('style' => 'document')); 
    $autodiscover->setOperationBodyStyle(array('use' => 'literal')); 
    $autodiscover->setClass('Tracker\Queue\Service') 
     ->setUri($_serverUrl); 
    echo $autodiscover->toXml(); 
} 
Questions connexes