Maison >développement back-end >tutoriel php >Yii Framework Official Guide Series 47 - Sujet spécial : Service Web
Le service Web est un système logiciel conçu pour prendre en charge l'accès mutuel entre ordinateurs sur les réseaux. Dans une application Web, elle utilise généralement un ensemble d'API accessibles depuis Internet et exécutant les services demandés sur l'hôte du système distant. Services requis par l'hôte du système. Par exemple, un client basé sur Flex peut appeler des fonctions pour implémenter une application Web exécutant PHP côté serveur. Les services Web s'appuient sur SOAP comme couche de base de la pile de protocoles de communication.
Yii fournit CWebService et CWebServiceAction pour simplifier l'implémentation des services Web dans les applications Web. Ces API sont implémentées sous forme de classes, appelées fournisseurs de services. Yii générera un WSDL pour chaque classe, décrivant quelle API est disponible et comment le client peut l'invoquer. Lorsqu'un client invoque une API, Yii instancie le fournisseur de services correspondant et appelle l'API demandée pour terminer la demande.
Remarque : CWebService s'appuie sur l'extension PHP SOAP. Veuillez vous assurer d'autoriser cette extension avant d'essayer les exemples de cette section.
Comme nous l'avons mentionné ci-dessus, le fournisseur de services est une définition de classe qui peut être invoquée à distance. Yii s'appuie sur les commentaires de la documentation et la réflexion de classe pour identifier les méthodes qui peuvent être appelées à distance ainsi que leurs paramètres et valeurs de retour.
Commençons par un simple service de cotation boursière. Ce service permet aux clients de demander des devis pour des actions spécifiées. Nous déterminons le prestataire de services comme suit. Notez que nous définissons une classe de fournisseur StockController
qui étend CController. Ce n'est pas obligatoire. Nous expliquerons pourquoi cela est fait dans un instant.
class StockController extends CController { /** * @param string the symbol of the stock * @return float the stock price * @soap */ public function getPrice($symbol) { $prices=array('IBM'=>100, 'GOOGLE'=>350); return isset($prices[$symbol])?$prices[$symbol]:0; //...return stock price for $symbol } }
Dans ce qui précède, nous déclarons la méthode @soap
via la balise getPrice
dans la documentation commentaire Pour une API de service Web. Fiez-vous aux commentaires de la documentation pour spécifier les types de données des paramètres d’entrée et les valeurs de retour. D'autres API peuvent être déclarées de la même manière.
Le fournisseur de services a été défini et nous permettons d'y accéder via le client. En particulier, nous allons créer une action de contrôleur qui expose ce service. Cela peut être fait facilement en définissant une action CWebServiceAction dans la classe du contrôleur. Pour notre exemple, nous le mettons à l'intérieur de StockController
.
class StockController extends CController { public function actions() { return array( 'quote'=>array( 'class'=>'CWebServiceAction', ), ); } /** * @param string the symbol of the stock * @return float the stock price * @soap */ public function getPrice($symbol) { //...return stock price for $symbol } }
C'est le service Web que nous devons construire ! Si nous essayons d'accéder à l'URL de l'action http://www.php.cn/
, nous verrons beaucoup de contenu XML, qui est en fait la description WSDL du service Web que nous avons défini.
Conseil : Par défaut, CWebServiceAction suppose que le contrôleur actuel est un fournisseur de services. En effet, nous définissons la méthode
getPrice
dansStockController
.
Pour compléter cet exemple, créons un client pour consommer le service Web que nous venons de créer. Le client dans l'exemple est écrit en php, mais il peut être écrit dans d'autres langages, comme Java
, C#
, Flex
, etc.
$client=new SoapClient('http://hostname/path/to/index.php?r=stock/quote'); echo $client->getPrice('GOOGLE');
Exécutez le script ci-dessus dans la page Web ou en mode console, nous verrons le prix de GOOGLE
350
.
Lorsque les méthodes et propriétés définies sont accessibles à distance, nous devons spécifier les types de données des paramètres d'entrée et de sortie. Les types de données primitifs suivants peuvent être utilisés :
str/string : correspond à xsd:string
;
int/integer : correspond à xsd:int
;
float/double : correspond à xsd:float
;
bool/boolean : correspond à xsd:boolean
;
date : correspond à xsd:date
;
heure : correspond à xsd:time
;
dateheure : correspond à xsd:dateTime
;
tableau : correspond à xsd:string
;
objet : correspond à xsd:struct
;
mixte : Correspond à xsd:anyType
.
Si le type n'appartient à aucun des types primitifs ci-dessus, il est considéré comme une propriété composée d'un type composite. Un type composite est considéré comme une classe et ses propriétés sont considérées comme des variables membres publiques de la classe et sont marquées par @soap
dans les commentaires de la documentation.
Nous pouvons également utiliser des types tableau en ajoutant []
après un type primitif ou composite. Cela définira un tableau du type spécifié.
Ce qui suit est un exemple de définition de l'API Web getPosts
et de renvoi d'un tableau d'objets Post
.
class PostController extends CController { /** * @return Post[] a list of posts * @soap */ public function getPosts() { return Post::model()->findAll(); } } class Post extends CActiveRecord { /** * @var integer post ID * @soap */ public $id; /** * @var string post title * @soap */ public $title; }
Afin d'obtenir le composite du type de client. paramètres, l'application doit définir le mappage du type WSDL vers la classe PHP correspondante. Cela se fait en configurant la propriété classMap de CWebServiceAction.
class PostController extends CController { public function actions() { return array( 'service'=>array( 'class'=>'CWebServiceAction', 'classMap'=>array( 'Post'=>'Post', // or simply 'Post' ), ), ); } ...... }
En implémentant l'interface IWebServiceProvider, le fournisseur de services peut intercepter l'invocation de méthode à distance. Dans IWebServiceProvider ::beforeWebMethod, le fournisseur de services peut obtenir l’instance CWebService actuelle et le nom de la méthode demandée via CWebService ::methodName. Il peut renvoyer false si la méthode distante ne doit pas être invoquée pour une raison quelconque (par exemple : accès non autorisé).
Ce qui précède est le contenu de la série 47 du guide officiel du Yii Framework - Thème spécial : service Web. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !