Webservice ist ein Softwaresystem, das den gegenseitigen Zugriff zwischen Computern über Netzwerke hinweg unterstützt. In einer Webanwendung verwendet sie normalerweise eine Reihe von APIs, auf die über das Internet zugegriffen werden kann und die die angeforderten Dienste auf dem Remote-Systemhost ausführen. Vom Systemhost benötigte Dienste. Beispielsweise könnte ein Flex-basierter Client Funktionen aufrufen, um eine Webanwendung zu implementieren, die PHP auf der Serverseite ausführt. Webdienste basieren auf SOAP als Basisschicht des Kommunikationsprotokollstapels.
Yii bietet CWebService und CWebServiceAction, um die Implementierung von Webdiensten in Webanwendungen zu vereinfachen. Diese APIs werden in Form von Klassen implementiert, die als Dienstanbieter bezeichnet werden. Yii generiert für jede Klasse eine WSDL, die beschreibt, welche API verfügbar ist und wie der Client sie aufrufen kann. Wenn ein Client eine API aufruft, instanziiert Yii den entsprechenden Dienstanbieter und ruft die angeforderte API auf, um die Anfrage abzuschließen.
Hinweis: CWebService basiert auf der PHP-SOAP-Erweiterung. Bitte stellen Sie sicher, dass Sie diese Erweiterung zulassen, bevor Sie die Beispiele in diesem Abschnitt ausprobieren.
Wie oben erwähnt, ist Dienstanbieter eine Klassendefinition, die remote aufgerufen werden kann. Yii verlässt sich auf Dokumentkommentare und Klassenreflexion, um zu ermitteln, welche Methoden remote aufgerufen werden können und welche Parameter und Rückgabewerte sie haben.
Beginnen wir mit einem einfachen Börsenkurs-Service. Mit diesem Service können Kunden Angebote für bestimmte Aktien anfordern. Den Dienstleister ermitteln wir wie folgt. Beachten Sie, dass wir eine Anbieterklasse StockController
definieren, die CController erweitert. Dies ist nicht erforderlich. Warum das so ist, erklären wir gleich.
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 } }
Oben deklarieren wir die Methode @soap
über das Tag getPrice
in der Dokumentation Kommentar Für eine Webdienst-API. Verlassen Sie sich auf Dokumentationskommentare, um Eingabeparameter-Datentypen und Rückgabewerte anzugeben. Andere APIs können auf ähnliche Weise deklariert werden.
Der Dienstanbieter wurde definiert und wir ermöglichen den Zugriff darauf über den Client. Insbesondere werden wir eine Controller-Aktion erstellen, die diesen Dienst verfügbar macht. Dies kann einfach durch Definieren einer CWebServiceAction-Aktion in der Controller-Klasse erfolgen. Für unser Beispiel haben wir es in StockController
eingefügt.
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 } }
Dies ist der Webdienst, den wir erstellen müssen! Wenn wir versuchen, auf die Aktions-URL http://www.php.cn/
zuzugreifen, sehen wir viele XML-Inhalte, bei denen es sich tatsächlich um die WSDL-Beschreibung des von uns definierten Webdienstes handelt.
Tipp: Standardmäßig geht CWebServiceAction davon aus, dass der aktuelle Controller ein Dienstanbieter ist. Dies liegt daran, dass wir die Methode
getPrice
inStockController
definieren.
Um dieses Beispiel zu vervollständigen, erstellen wir einen Client, der den soeben erstellten Webdienst nutzt. Der Client im Beispiel ist in PHP geschrieben, kann aber auch in anderen Sprachen geschrieben werden, z. B. Java
, C#
, Flex
usw.
$client=new SoapClient('http://hostname/path/to/index.php?r=stock/quote'); echo $client->getPrice('GOOGLE');
Führen Sie das obige Skript im Webseiten- oder Konsolenmodus aus. Wir sehen den Preis von GOOGLE
350
.
Wenn auf die definierten Methoden und Eigenschaften remote zugegriffen wird, müssen wir die Datentypen der Eingabe- und Ausgabeparameter angeben. Die folgenden primitiven Datentypen können verwendet werden:
str/string: entspricht xsd:string
;
int/integer: entspricht xsd:int
;
float/double: entspricht xsd:float
;
bool/boolean: entspricht xsd:boolean
;
Datum: entspricht xsd:date
;
Uhrzeit: entspricht xsd:time
;
DatumUhrzeit : entspricht xsd:dateTime
;
Array: entspricht xsd:string
;
Objekt: entspricht xsd:struct
;
gemischt: Entspricht xsd:anyType
.
Wenn der Typ zu keinem der oben genannten primitiven Typen gehört, wird er als zusammengesetzte Eigenschaft betrachtet eines zusammengesetzten Typs. Ein zusammengesetzter Typ wird als Klasse betrachtet und seine Eigenschaften werden als öffentliche Mitgliedsvariablen der Klasse betrachtet und in Dokumentationskommentaren mit @soap
gekennzeichnet.
Wir können Array-Typen auch verwenden, indem wir []
nach einem primitiven oder zusammengesetzten Typ anhängen. Dadurch wird ein Array des angegebenen Typs definiert.
Das Folgende ist ein Beispiel für die Definition der getPosts
-Web-API und die Rückgabe eines Arrays von Post
-Objekten.
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; }
Um den Verbund vom Clienttyp zu erhalten Parameter muss die Anwendung die Zuordnung vom WSDL-Typ zur entsprechenden PHP-Klasse definieren. Dies erfolgt durch die Konfiguration der Eigenschaft classMap von CWebServiceAction.
class PostController extends CController { public function actions() { return array( 'service'=>array( 'class'=>'CWebServiceAction', 'classMap'=>array( 'Post'=>'Post', // or simply 'Post' ), ), ); } ...... }
Durch die Implementierung der IWebServiceProvider-Schnittstelle kann der Dienstanbieter Remote-Methodenaufrufe abfangen. In IWebServiceProvider::beforeWebMethod kann der Dienstanbieter die aktuelle CWebService-Instanz und den Namen der über CWebService::methodName angeforderten Methode abrufen. Es kann „false“ zurückgeben, wenn die Remote-Methode aus irgendeinem Grund nicht aufgerufen werden soll (z. B. unbefugter Zugriff).
Das Obige ist der Inhalt von Yii Framework Official Guide Series 47 – Spezialthema: Webservice. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).