CodeZine(コードジン)

特集ページ一覧

AJAXでPHP Webサービスを利用する

NuSOAPライブラリ、AJAX技術、SOAPプロトコルの使用法

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/05/29 14:00

 本稿では、NuSOAPライブラリを使用してPHP Webサービスを構築する方法と、AJAX技術およびSOAPプロトコルを使用してPHP Webサービスを利用するJavaScriptクライアントを構築する方法を中心に説明します。

目次

はじめに

 本稿では、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を使って開発するサーバは、TriangleAreaRectangleAreaという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つのメソッドで指定できます。例えば、TriangleAreaRectangleAreaメソッドを登録するには、次のように行います。

// 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という名前のフォルダに保存しておきます)。

リスト1 シンプルなWebサービス
<?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);
?>

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

  • Octavia Andreea Anghel(Octavia Andreea Anghel)

    経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5