この記事の例では、PHP が SOAP 拡張機能を使用して WebService を実装する方法について説明します。詳細は次のとおりです。
最近、PHP プロジェクトで外部インターフェイスに接続する場合、検索エンジンに関する関連記事がほとんど見つかりません。強力なオープンソース ソフトウェア NuSOAP (ダウンロード アドレス: http://sourceforge.net/projects/nusoap/) と呼ばれる一部のクラスです。記事で説明している環境はPHP 4.3です。現在ではPHP 5.2またはPHP 5.3が一般的です。最初に試してみたのですが、実行が間違っていました。NuSOAP が提供する Soapclient クラスが、PHP 5 の新しい組み込み SOAP 拡張機能を持つ SoapClient クラスと競合することがわかりました。
NuSOAP はすべての PHP 環境で使用できると主張していますが、サーバーのセキュリティ設定の影響を受けません。ただし、多くのクラスファイルを参照する必要があるため、実用的である限り、PHP 5 で追加された組み込みの SOAP 拡張機能を使用する方が良いと考えています。まず、SOAP について学びます:
1. SOAP と XML-PRC の比較
Web サービス開発の初期の頃、XML 形式のメッセージの最初の主要な用途は、RPC が意味する XML-RPC プロトコルに適用されました。リモートプロシージャコールの場合。 XML リモート プロシージャ コール (XML-RPC) では、クライアントは、名前、サービスを実行しているプログラム、および入力パラメータを含む特定のメッセージを送信します。
XML-RPC は、限られたデータ型といくつかの単純なデータ構造のみを使用できます。このプロトコルは十分強力ではないと考えられたため、SOAP が登場しました。SOAP の元々の定義はシンプル オブジェクト アクセス プロトコルでした。その後、SOAP は単純なものではなく、オブジェクト指向言語を使用する必要がないことに徐々に誰もが気づき、現在では SOAP という名前だけが使われるようになりました。
XML-RPC には単純なデータ型のセットしかありません。代わりに、SOAP は XML スキーマの継続的な進化を活用してデータ型を定義します。同時に、SOAP は XML 名前空間も利用できますが、XML-RPC では必要ありません。これにより、SOAP メッセージの先頭を任意のタイプの XML 名前空間宣言にすることができますが、その代わりに、システム間の複雑さと非互換性が増大します。
コンピューター業界の覚醒により、人々は XML ベースの Web サービスのビジネスの可能性を発見し、企業はアイデア、意見、議論、標準化の試みを継続的に模索し始めました。かつてW3Cは、実際にSOAPを作ったXMLプロトコル・ワーキング・グループ(XML Protocol Working Group)も含めて、「Webサービス活動」の名で成果展示会を開催しようとしたことがある。何らかの形で SOAP に関連している、または SOAP に依存している Web サービスに関連する標準化の取り組みの数は、驚くべき程度に 2 倍に増加しています。
元々、SOAP は XML-RPC の拡張として開発されました。その主な重点は、WSDL ファイルから取得したメソッド名と変数名を使用してリモート プロシージャ呼び出しを行うことです。現在、継続的な進歩により、人々は単なる「ファイル」メソッド (基本的に SOAP エンベロープを使用して XML 形式のファイルを送信する) 以外の SOAP の使用方法を発見しました。いずれにせよ、SOAP をマスターするには、WSDL が果たす役割を理解することが基本です。
2. SOAP パケット構造の分析
SOAP メッセージは、SOAP ヘッダーと SOAP ボディを含めて SOAP エンベロープと呼ばれます。このうち、SOAPヘッダーはセキュリティ(証明書を利用してWebサービスにアクセスする)など、Webサービスの機能を拡張するためのさまざまなメッセージを簡単に挿入することができ、SOAPボディはMarshall以降の情報である特定のメッセージテキストです。
SOAP を呼び出すとき、つまり HTTP Post メッセージを URL (http://api.google.com/search/beta2 など) に送信するとき (SOAP 仕様に従って、HTTP Get メッセージもサポートされます)、メソッドの呼び出し 名前は、HTTP リクエスト ヘッダーの SOAP アクションと、その後に続く SOAP エンベロープで指定されます。サーバーはリクエストを受信し、計算を実行し、返された結果を XML にマーシャリングし、HTTP を使用してクライアントに返します。
3. 単純な SOAP の例
SOAP 開発には通常 3 つの方法があります:
1)、PEAR 独自の SOAP 拡張機能
2)、PHP 独自の SOAP 拡張機能
3)、NuSOAP (純粋な PHP)。
PHP 5 の新機能は、PHP の一部として提供される組み込み SOAP 拡張機能であるため、個別のパッケージをダウンロード、インストール、管理する必要はありません。これは、PHP ではなく C で書かれた最初の SOAP 実装であるため、著者はこれが大幅に高速であると主張しています。関連ドキュメントは、PHP マニュアル (php_soap.dll) の「関数リファレンス」セクションに含まれています。
.NET WEB サービスにアクセスするクライアントの例:
< ? php $objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL"); $param = array("ZipCode"=>'12209'); $out = $objSoapClient->ValidateZip($param); $data = $out->ValidateZipResult; echo $data; ?>
IV. 例
1)、PHP を使用して SOAP サービスを作成します
soap_server.php を作成します (仮想パスは http://localhost/php です) /soap/soap_server.php)
< ? php /** * A simple math utility class */ class math{ /** * Add two integers together * * @param integer $a The first integer of the addition * @param integer $b The second integer of the addition * @return integer The sum of the provided integers */ public function add($a, $b){ return $a + $b; } /** * Subtract two integers from each other * * @param integer $a The first integer of the subtraction * @param integer $b The second integer of the subtraction * @return integer The difference of the provided integers */ public function sub($a, $b){ return $a - $b; } /** * Div two integers from each other * * @param integer $a The first integer of the subtraction * @param integer $b The second integer of the subtraction * @return double The difference of the provided integers */ public function div($a, $b){ if($b == 0){ throw new SoapFault(-1, "Cannot divide by zero!"); } return $a / $b; } } $server = new SoapServer('math.wsdl', array('soap_version'=>SOAP_1_2)); $server->setClass("math"); $server->handle(); ?>
注:
a)、数学クラスは近々公開される Web サービスです
b)、$server->setClass ではありません。 addClass。
2) PHP クライアントを使用して、新しく作成した SOAP サービスにアクセスします
< ? php // $client = new SoapClient('http://localhost/php/soap/math.wsdl'); $client = new SoapClient("http://localhost/php/soap/soap_server.php?WSDL"); try{ $result = $client->div(8, 2); // will cause a Soap Fault if divide by zero print "The answer is: $result"; }catch(SoapFault $e){ print "Sorry an error was caught executing your request: {$e->getMessage()}"; } ?>
基本的に、http://localhost/php/soap/soap_server.php?WSDL は、コメント行が指す wsdl 記述ファイルにアクセスするため、この WSDL ファイルは事前に生成しておく必要があります。 Javaなど他の言語の場合は動的に生成できます。 PHP に付属する SOAP 拡張機能の場合、この WSDL ファイルを事前に生成する必要があります。
ZendStudio を使用して静的 WSDL ファイルを生成できます。このとき、数学クラスの phpdoc が WSDL を生成するためのメタデータとして使用されます。 ZendStudio を使用して wsdl ファイルを生成する場合、Web サービスのターゲット アドレスを正しく指定する必要があります。スニペットは次のとおりです。
... <service name="mathService"> <port binding="typens:mathBinding" name="mathPort"> <soap:address location="http://localhost/php/soap/soap_server.php"></soap:address> </port> </service> ...
注:调用PHP Webserver的方法必须传入命名参数。
更多PHP使用SOAP扩展实现WebService的方法相关文章请关注PHP中文网!