Web サービスは、ネットワークを介したコンピューター間の相互アクセスをサポートするように設計されたソフトウェア システムです。 Web アプリケーションでは通常、インターネットからアクセスできる一連の API を使用し、リモート システム ホスト上で要求されたサービスを実行します。システムホストに必要なサービス。たとえば、Flex ベースのクライアントは、サーバー側で PHP を実行する Web アプリケーションを実装する関数を呼び出すことがあります。 Web サービスは、通信プロトコル スタックの基本層として SOAP に依存します。
Yii は、Web アプリケーションでの Web サービスの実装を簡素化するために CWebService と CWebServiceAction を提供します。これらの API は、サービスプロバイダー と呼ばれるクラスの形式で実装されます。Yii は、利用可能な API とクライアントがそれを呼び出す方法を記述した WSDL をクラスごとに生成します。クライアントが API を呼び出すと、Yii は対応するサービスプロバイダーをインスタンス化し、要求された API を呼び出してリクエストを完了します。
注: CWebService は PHP SOAP 拡張機能に依存しています。このセクションの例を試す前に、この拡張機能を許可していることを確認してください。
上で述べたように、サービスプロバイダーはリモートから呼び出すことができるクラス定義です。 Yii は、ドキュメントコメントとクラスリフレクションを利用して、リモートで呼び出すことができるメソッドとそのパラメータと戻り値を識別します。
簡単な株価情報サービスから始めましょう。このサービスにより、クライアントは指定された株式の見積りをリクエストすることができます。当社は、以下のとおりサービス提供者を決定します。 CController を拡張するプロバイダー クラス StockController
を定義していることに注意してください。これは必須ではありません。なぜこれが行われるのかについては後ほど説明します。 StockController
。这是不是必需的。马上我们将解释为什么这样做。
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 } }
在上面的,我们通过在文档注释中的@soap
标签声明getPrice
方法为一个Web service API。依靠文档注释指定输入的参数数据类型和返回值。其他的API可使用类似方式声明。
已经定义了service provider,我们使他能够通过客户端访问。特别是,我们要创建一个控制器动作暴露这个服务。可以做到这一点很容易,在控制器类中定义一个CWebServiceAction动作。对于我们的例子中,我们把它放在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 } }
这就是我们需要建立的Web service!如果我们尝试访问 动作网址http://www.php.cn/
,我们将 看到很多XML内容,这实际上是我们定义的Web service的WSDL描述。
提示:在默认情况下, CWebServiceAction 假设当前的控制器 是service provider。这就是因为我们定义
getPrice
方法在StockController
中。
要完成这个例子,让我们创建一个客户端来消费我们刚刚创建的Web service。例子中的客户端用php编写的,但可以用别的语言编写,例如Java
, C#
, Flex
等等。
$client=new SoapClient('http://hostname/path/to/index.php?r=stock/quote'); echo $client->getPrice('GOOGLE');
在网页中或控制台模式运行以上脚本,我们将看到GOOGLE
的价格350
。
当定义的方法和属性被远程访问,我们需要指定输入和输出参数的数据类型。以下的原始数据类型可以使用:
str/string: 对应 xsd:string
;
int/integer: 对应 xsd:int
;
float/double: 对应 xsd:float
;
bool/boolean: 对应 xsd:boolean
;
date: 对应 xsd:date
;
time: 对应 xsd:time
;
datetime: 对应 xsd:dateTime
;
array: 对应 xsd:string
;
object: 对应 xsd:struct
;
mixed: 对应 xsd:anyType
.
如果类型不属于上述任何原始类型,它被看作是复合型组成的属性。复合型类型被看做类,他的属性当做类的公有成员变量,在文档注释中被用@soap
标记。
我们还可以使用数组类型通过附加[]
在原始或 复合型类型的后面。这将定义指定类型的数组。
下面就是一个例子定义getPosts
网页API,返回一个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; }上記では、ドキュメント コメントの
@soap
タグを介して getPrice
メソッドを Web サービス API として宣言しました。入力パラメーターのデータ型と戻り値を指定するには、ドキュメントのコメントを参照してください。他の API も同様の方法で宣言できます。 2. Web サービス アクションの宣言 (Web サービス アクションの定義) サービス プロバイダーが定義され、クライアント経由でアクセスできるようにします。特に、このサービスを公開するコントローラー アクションを作成します。これは、コントローラー クラスで CWebServiceAction アクションを定義することで簡単に実行できます。この例では、それを StockController
に配置します。 class PostController extends CController { public function actions() { return array( 'service'=>array( 'class'=>'CWebServiceAction', 'classMap'=>array( 'Post'=>'Post', // or simply 'Post' ), ), ); } ...... }🎜🎜これは構築する必要がある Web サービスです。アクション URL
http://www.php.cn/
にアクセスしようとすると、多くの XML コンテンツが表示されます。これは実際には、定義した Web サービスの WSDL 記述です。 🎜🎜🎜ヒント: デフォルトでは、CWebServiceAction は現在のコントローラーがサービス プロバイダーであると想定します。これは、StockController
で getPrice
メソッドを定義しているためです。 🎜🎜🎜3. Web サービスの利用🎜🎜 この例を完了するには、作成したばかりの Web サービスを利用するクライアントを作成しましょう。この例のクライアントは PHP で作成されていますが、Java
、C#
、Flex
などの他の言語で作成することもできます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜Web ページまたはコンソール モードで上記のスクリプトを実行すると、GOOGLE
350
の価格が表示されます。 🎜🎜4. データ型🎜🎜 定義されたメソッドとプロパティにリモートでアクセスする場合、入力パラメーターと出力パラメーターのデータ型を指定する必要があります。次のプリミティブ データ型を使用できます: 🎜xsd:string
に対応します;🎜xsd:int
に対応します;🎜xsd:float
に対応します;🎜xsd:boolean
に対応します;🎜xsd:date
に対応します;🎜xsd:time
に対応します;🎜xsd:dateTime
に対応します;🎜 xsd:string
に対応します;🎜xsd:struct
に対応します;🎜xsd:anyType
に対応します。🎜@soap
でマークされます。 🎜🎜プリミティブ型または複合型の後に []
を追加することで配列型を使用することもできます。これにより、指定された型の配列が定義されます。 🎜🎜以下は、getPosts
Web API を定義し、Post
オブジェクトの配列を返す例です。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜5. クラスマッピング🎜🎜クライアントから複合パラメータを取得するには、アプリケーションは WSDL 型から対応する PHP クラスへのマッピングを定義する必要があります。これは、CWebServiceAction のプロパティ classMap を構成することによって行われます。 🎜🎜🎜🎜🎜🎜りー🎜🎜IWebServiceProvider インターフェイスを実装することにより、サービス プロバイダーはリモート メソッド呼び出しをインターセプトできます。 IWebServiceProvider::beforeWebMethod では、サービス プロバイダーは、現在の CWebService インスタンスと、CWebService::methodName を通じて要求されたメソッドの名前を取得できます。何らかの理由 (例: 不正アクセス) でリモート メソッドを呼び出す必要がない場合は、false を返すことができます。
上記は、Yii Framework 公式ガイド シリーズ 47 - 特別トピック: Web サービスの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。