Ce document décrit comment obtenir et installer NuSOAP, puis fournit quelques exemples pour illustrer les fonctions de NuSOAP. Il ne s'agit pas d'une introduction complète à NuSOAP, mais nous espérons que certains développeurs PHP pourront avoir une bonne introduction.
NuSOAP est un ensemble de classes PHP qui permettent aux développeurs de créer et d'utiliser des services Web SOAP. Il ne nécessite l’installation d’aucune extension PHP. Il a été développé le 3 décembre 2004 et la version actuelle est NuSOAP (0.6.7). Prenant en charge la spécification SOAP 1.1, il peut produire et utiliser WSDL 1.1, et prend également en charge les services rpc/encoded et document/literal. Cependant, il est important de noter que NuSOAP ne fournit pas une implémentation complète comme .NET et Apache Axis.
Bonjour le monde
Je vais commencer par l'exemple "Hello, World" et écrire le code client et serveur NuSOAP de base.
Commençons par le côté serveur, car sans le côté serveur, cela n'a aucun sens d'avoir le côté client. Nous allons écrire une méthode SOAP nommée Hello qui prend un seul paramètre et renvoie une chaîne, et nous espérons que les commentaires dans le code fourniront des instructions utiles.
<?php
// Récupère le code NuSOAP
require_once('nusoap.php');
// Crée l'instance de serveur
$server = nouveau serveur_soap ;
// Enregistre la méthode à exposer
$server->register('bonjour');
// Définir la méthode comme une fonction PHP
fonction bonjour ($ nom) {
return 'Bonjour,' .
}
// Utiliser la requête pour (essayer) d'invoquer le service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$serveur->service($HTTP_RAW_POST_DATA);
?>
Voici le code du client. Il y a quelques points importants à noter : Tout d'abord, lors de la création de l'instance soapclient, vous devez spécifier une URL de service comme paramètre. Dans cet exemple, helloworld.php est accessible depuis http://. localhost/phphack de. Bien entendu, les services que vous souhaitez utiliser sont placés dans des URL différentes ; deuxièmement, lors de l'appel du service, le premier paramètre est le nom du service, qui doit correspondre à un nom de méthode valide (certains serveurs sont sensibles à la casse). Dans cet exemple, il doit correspondre à la méthode déjà enregistrée dans helloworld.php. Enfin, le deuxième paramètre est un tableau qui sera passé en paramètre à la méthode du service SOAP. Puisque la méthode hello dans helloworld.php n’a qu’un seul paramètre, le tableau n’a qu’un seul élément.
<?php
// Récupère le code NuSOAP
require_once('nusoap.php');
// Crée l'instance client
$client = new soapclient('http://localhost/phphack/helloworld.php');
// Appel de la méthode SOAP
$result = $client->call('bonjour', array('name' => 'Scott'));
// Afficher le résultat
print_r($résultat);
?>
Débogage
Lors de la programmation, vous devez déboguer chaque fois que quelque chose ne va pas. NuSOAP fournit un ensemble d'outils pour vous aider à le faire. Les informations que vous devez vérifier lors du débogage de NuSOAP sont les informations de demande envoyées et les informations correspondantes renvoyées. La classe client de NuSOAP vous permet de visualiser ces informations via ses deux membres. Par exemple, voici une version modifiée de helloworldclient.php qui affiche la requête et la réponse. Dans la section suivante, je passerai en revue les informations de demande et de réponse affichées dans le code client.
<?php
// Récupère le code NuSOAP
require_once('nusoap.php');
// Crée l'instance client
$client = new soapclient('http://localhost/phphack/helloworld.php');
// Appel de la méthode SOAP
$result = $client->call('bonjour', array('name' => 'Scott'));
// Afficher le résultat
print_r($résultat);
// Afficher la requête et la réponse
echo '<h2>Demande</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) '</pre>';
echo '<h2>Réponse</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) '</pre>';
?>
NuSOAP fournit également une méthode pour afficher les informations de débogage via les journaux en utilisant ses classes. L'ajout du code suivant affichera de longues informations de débogage. Malheureusement, la description du résultat doit être laissée au lecteur.
// Afficher les messages de débogage
echo '<h2>Débogage</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) '</pre>';
Il est intéressant de noter que ces informations de débogage sont en XML à la fin du format SOAP correspondant. s'affiche pour pouvoir être visualisé dans le client. Le débogage côté serveur ressemble à ceci :
<?php
// Récupère le code NuSOAP
require_once('nusoap.php');
// Activer le débogage *avant* de créer une instance de serveur
$débogage = 1 ;
// Crée l'instance de serveur
$server = nouveau serveur_soap ;
// Enregistre la méthode à exposer
$server->register('bonjour');
// Définir la méthode comme une fonction PHP
fonction bonjour ($ nom) {
return 'Bonjour,' .
}
// Utiliser la requête pour (essayer) d'invoquer le service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$serveur->service($HTTP_RAW_POST_DATA);
?>
La troisième méthode de débogage n'est pas vraiment du débogage, c'est une bonne pratique de programmation. L'exemple ci-dessus ne vérifie pas les erreurs lors de l'appel de SOAP. Un client plus robuste ressemblerait à ceci :
<?php.
// Récupère le code NuSOAP
require_once('nusoap.php');
// Crée l'instance client
$client = new soapclient('http://localhost/phphack/helloworld.php');
// Recherche d'une erreur
$err = $client->getError();
si ($err) {
// Afficher l'erreur
echo '<p><b>Erreur du constructeur : ' . $err '</b></p>';
// À ce stade, vous savez que l'appel qui suit échouera
}
// Appel de la méthode SOAP
$result = $client->call('bonjour', array('name' => 'Scott'));
// Recherche d'un défaut
if ($client->fault) {
echo '<p><b>Défaut : ';
print_r($résultat);
écho '</b></p>';
} autre {
// Vérifie les erreurs
$err = $client->getError();
si ($err) {
// Afficher l'erreur
echo '<p><b>Erreur : ' . $err '</b></p>';
} autre {
// Afficher le résultat
print_r($résultat);
}
}
?>
Afin de tester le code, vous devez provoquer une erreur, par exemple, changer le nom de la méthode appelée hello en goodbye.
Demande et réponse
J'ai montré dans l'exemple ci-dessus à quel point il est facile d'afficher les informations de requête et de réponse SOAP. Voici les informations de requête pour hello2client.php :
POST /phphack/helloworld2.php HTTP/1.0
Hôte : hôte local
Agent utilisateur : NuSOAP/0.6.8 (1.81)
Type de contenu : texte/xml ; charset=ISO-8859-1
Action SOAP : ""
Longueur du contenu : 538
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV :Enveloppe
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Corps>
<ns1:bonjour xmlns:ns1=" http://testuri.org ">
<name xsi:type="xsd:string">Scott</name>
</ns1:bonjour>
</SOAP-ENV:Corps>
</SOAP-ENV:Enveloppe>
Dans les en-têtes HTTP, vous verrez que SOAPAction est une chaîne vide, qui est sa valeur par défaut. Votre méthode de service peut définir la valeur de SOAPAction et votre code client peut appeler la méthode spécifiant SOAPAction en tant que paramètre.
Dans la charge utile XML, vous pouvez voir que NuSOAP utilise le codage ISO-8859-1 bien connu comme Latin-1. Afin de spécifier un codage différent, vous pouvez définir l'attribut soap_defencoding sur l'instance client soapclient. Il est bien entendu de la responsabilité du programmeur d'encoder les données des paramètres en utilisant l'encodage spécifié. Heureusement, PHP fournit de nombreuses fonctions pour encoder et décoder les données d'encodage les plus courantes dans SOAP, telles que UTF-8.
Une autre chose à noter est que l'élément spécifie la méthode à appeler. L'élément nommé hello est placé sous le nom de domaine http://tempuri.org . Spécifier le vrai nom de domaine est une bonne pratique et est également très courant pour de nombreux services. .C'est nécessaire. Un futur document est affiché ici :
Le service SOAP répond comme ceci :
HTTP/1.1 200 OK
Serveur : Microsoft-IIS/5.0
Date : mercredi 3 novembre 2004 21:32:34 GMT
X-Powered-By: ASP.NET
X-Powered-By : PHP/4.3.4
Serveur : Serveur NuSOAP v0.6.8
Serveur X-SOAP : NuSOAP/0.6.8 (1.81)
Type de contenu : texte/xml ; charset=ISO-8859-1
Longueur du contenu : 556
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV :Enveloppe
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Corps>
<ns1:helloResponse xmlns:ns1=" http://tempuri.org ">
<return xsi:type="xsd:string">Bonjour Scott</return>
</bonjourRéponse>
</SOAP-ENV:Corps>
</SOAP-ENV:Enveloppe>