Je dois envoyer/retourner des objets ou un tableau depuis/vers PHP en utilisant SOAP. Des bons liens?PHP SOAP: Comment puis-je retourner des objets de PHP en utilisant SOAP?
Répondre
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
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
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
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();
}
- 1. Comment utiliser SOAP/WSDL en PHP 4?
- 2. Soap Web Service PHP
- 3. Comment obtenir un post SOAP en PHP?
- 4. Collecte/Traitement des en-têtes dans PHP Soap Server
- 5. PHP SOAP fread() taille POST dynamique
- 6. Passing tableau à la fonction SOAP en PHP
- 7. Remplacements SOAP/solutions de contournement/librairies en PHP
- 8. php SOAP tutoriel envoyer et recevoir des messages
- 9. PHP Soap appel non-WSDL: comment passez-vous les paramètres?
- 10. Codage de caractères SOAP
- 11. Définir les attributs pour les paramètres de demande SOAP PHP
- 12. SharePoint via SOAP en utilisant Python
- 13. Attachement SOAP de .NET 3.5 vers le service web PHP
- 14. Attraper les incompatibilités de type avec PHP Soap Server
- 15. JPA paresseux Hibernate utilisant SOAP
- 16. Sugar CRM SOAP get_entry_list
- 17. Comment implémenter SOAP?
- 18. Appel d'une méthode SOAP avec PHP pour un service spécifique
- 19. Message d'erreur essayant d'attraper un soapfault en utilisant la classe PHP Soap
- 20. Le passage d'un tableau PHP dans un appel SOAP
- 21. PHP - SOAP - lastResponse - Afficher les champs et les valeurs?
- 22. Autorisation SOAP et certificat
- 23. Ajouter un certain espace de nommage à une enveloppe SOAP en PHP
- 24. Fichier de SOAP, comment économiser?
- 25. Comment connecter/extraire des données d'une base de données MYSQL en utilisant des objets en PHP?
- 26. Comment envoyer ce XML SOAP en Perl?
- 27. SOAP sur les sous-domaines
- 28. Gestion de documents SOAP Python
- 29. Objets et gestion des erreurs en PHP
- 30. Définir l'en-tête SOAP personnalisé en utilisant Axis 1.4
vous utilisez php5 ou php4? –