はじめに
本稿では、NuSOAPライブラリを使用してPHP Webサービスを構築する方法と、AJAX技術およびSOAPプロトコルを使用してPHP Webサービスを利用するJavaScriptクライアントを構築する方法を中心に説明します。まずは、Webサービスの用語について少し説明しましょう。
SOAPおよびWebサービスに関する概略
SOAP(Simple Object Access Protocol)は、XMLベースの要求/応答メッセージングプロトコルです。SOAPの重要な特徴は、特定のトランスポートプロトコルに依存せず(最も頻繁に使用されるのはHTTPですが、SMTP、MIMEなども使用できます)、特定のオペレーティングシステムやプログラミング言語にも依存しないという点です。そのため、さまざまなソフトウェアアーキテクチャ上で高い柔軟性を発揮するだけではなく、非常に使いやすくなっています。
Webサービスとは、ネットワーク上でリモートに呼び出されるよう設計されたソフトウェアシステムの一般的な名称です。これらのサービスで実行されるタスクは多岐にわたり、実装もそれぞれに異なりますが、一般的なWebサービスは次のことを前提としています。
- Webサービスは、一連の操作に基づいて問い合わせを受けるサーバとして公開されます。
- 利用可能な操作を、WSDL(Webサービス記述言語)ドキュメントと呼ばれるXMLドキュメントを使用して「パブリッシュ」します。通常、このドキュメントは、人間の手ではなく機械によって生成され、解析(分析)されます。
- Webサービスにアクセスするエンティティは、Webサービスクライアントと呼ばれます。
- クライアントとサーバ間の通信プロトコルはSOAPです。
PHPでSOAPを使用する
Webサービスはまたたく間にさまざまな分野で利用されるようになったため、一般的なプログラミング言語のほとんどは、Webサービスの構築と利用に対するサポートを提供し、より強化すべく取り組んできました。例えば、PHPには、Webサービスのサポートを追加するいくつかの拡張機能(PEARとライブラリ)があります。PHP5以降は、このようなサポートはNuSOAPと呼ばれるライブラリとして、PHPに標準装備されています。
NuSOAPライブラリは操作性と性能に優れているため、本稿では、このライブラリを使用して完全なWebサービスを開発する方法を説明します。もし読者が他の拡張機能/ライブラリに精通していて、本稿の後半部分(JavaScript AJAXクライアントの開発方法)にのみ関心がある場合は、お好みの技術を使用して、サーバ側Webサービスを再構築することももちろん可能です。
NuSOAPライブラリは、HTTPプロトコルを使用してSOAPメッセージの送受信をサポートするPHPクラスの集合です。NuSOAPライブラリは、別名「SOAPx4」とも呼ばれるNuSphere社の製品で、公式サイトからダウンロードできます。NuSOAPクラスを使用するには、PHPソースファイル内に次のコードスニペットを含めます。
require_once('{NuSOAPフォルダパスおよびフォルダ名}/lib/nusoap.php');
本稿でこれからNuSOAPを使って開発するサーバは、TriangleArea
とRectangleArea
という2つのメソッドを公開します。これらのメソッドは、その名のとおり、それぞれ三角形と長方形の面積を求めます。次に、Webサービスを開発する手順を紹介します。
1、メソッドの記述
まず、2つのメソッドを記述します。お分かりのように単純な作業です。
// Define the TriangleArea method as a PHP function function TriangleArea($b, $h) { return 'The triangle area is:' .((b*h)/2); } // Define the RectangleArea method as a PHP function function RectangleArea($L, $l) { return 'The rectangle area is:' .($L*$l);
それぞれのメソッドは2つのパラメータを取ります。TriangleArea
メソッドは三角形の底辺と高さの整数値、RectangleArea
メソッドは長方形の幅と高さです。どちらのメソッドも、計算において求められた面積の値を含む文字列を返します。
これら2つのメソッドを記述したら、メソッドを公開するためのWebサービスが必要になります。
2、Webサービスインスタンスを取得
NuSOAPは、Webサービスの詳細を1つのクラスにカプセル化しているので、次のように空のコンストラクタsoap_server
を呼び出すだけで、Webサービスインスタンスを取得できます。
// Create the server instance $server = new soap_server();
3、WSDLファイルの名前と名前空間を指定
Webサービスサーバに対応するWSDLファイルの名前と名前空間を指定します。これを行うには、名前と名前空間のみを必要とするnusoap.php
クラスのconfigureWSDL
メソッドを呼び出します。
// Initialize WSDL support $server->configureWSDL('mathwsdl', 'urn:mathwsdl');
4、メソッドを登録
次に、メソッドを登録します(この例では2つあります)。メソッドを登録することで、そのメソッドの名前、引数、戻り値の型、SOAPアクション、スタイル、エンコーディング、説明をWebサービスサーバに認識させます。これらのプロパティはすべて、register
という1つのメソッドで指定できます。例えば、TriangleArea
とRectangleArea
メソッドを登録するには、次のように行います。
// Register the TriangleArea method $server->register('TriangleArea', // method name array('b' => 'xsd:int', 'h' => 'xsd:int'), // input parameters array('area_t' => 'xsd:string'), // output parameters 'urn:mathwsdl', // namespace 'urn:mathwsdl#TriangleArea', // soapaction 'rpc', // style 'encoded', // use 'Calculate a triangle area as (b*h)/2' // documentation ); // Register the RectangleArea method to expose $server->register('RectangleArea', // method name array('L' => 'xsd:int', 'l' => 'xsd:int'), // input parameters array('area_r' => 'xsd:string'), // output parameters 'urn:mathwsdl', // namespace 'urn:RectangleAreawsdl#RectangleArea', // soapaction 'rpc', // style 'encoded', // use 'Calculate a rectangle area as (L*l)' // documentation );
この登録内容は、NuSOAP固有のものです。
5、Webサービスを起動
最後に、次のようにしてNuSOAPのservice
メソッドを呼び出し、Webサービスを起動します。
// Use the request to (try to) invoke the service $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA);
このシンプルな5つのステップを実行すると、リスト1のWebサービスのようなコードが得られます(これをwebserviceという名前のフォルダに保存しておきます)。
<?php // Pull in the NuSOAP code require_once('./nusoap-php5-0.9/lib/nusoap.php'); // Create the server instance $server = new soap_server(); // Initialize WSDL support $server->configureWSDL('mathwsdl', 'urn:mathwsdl'); // Register the TriangleArea method to expose it $server->register('TriangleArea', // method name array('b' => 'xsd:int', 'h' => 'xsd:int'), // input parameters array('area_t' => 'xsd:string'), // output parameters 'urn:mathwsdl', // namespace 'urn:mathwsdl#TriangleArea', // soapaction 'rpc', // style 'encoded', // use 'Calculate a triangle area as (b*h)/2' // documentation ); // Register the RectangleArea method to expose it $server->register('RectangleArea', // method name array('L' => 'xsd:int', 'l' => 'xsd:int'), // input parameters array('area_r' => 'xsd:string'), // output parameters 'urn:mathwsdl', // namespace 'urn:RectangleAreawsdl#RectangleArea', // soapaction 'rpc', // style 'encoded', // use 'Calculate a rectangle area as (L*l)' // documentation ); // Define the TriangleArea method as a PHP function function TriangleArea($b, $h) { return 'The triangle area is: ' .((b*h)/2); } // Define the RectangleArea method as a PHP function function RectangleArea($L, $l) { return 'The rectangle area is: ' .($L*$l); } // Use the request to (try to) invoke the service $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA); ?>