この記事では、主に PHP で SOAP 拡張機能を使用して WebService を実装する方法を紹介し、SOAP 拡張機能の原理と WebService を実装するための関連テクニックを例の形式で詳細に分析します。困っている友達が参考になれば幸いです。
詳細は以下のとおりです。
最近、PHP プロジェクトで外部インターフェイスを接続するには、WebService が関係します。検索エンジンに関する関連記事は、いわゆる強力なオープンソース ソフトウェアである NuSOAP に関するものがほとんどです。つまり、いくつかのクラスです。記事の執筆および説明を行っている環境はPHP 4.3です。まずは試してみましたが、NuSOAPが提供するsoapclientクラスが、PHP 5のSOAP拡張機能が組み込まれているSoapClientクラスと競合することが判明しました。
NuSOAP はすべての PHP 環境で使用できると主張していますが、サーバーのセキュリティ設定の影響を受けません。ただし、多くのクラスファイルを参照する必要があるため、実用的である限り、PHP 5 で追加された組み込みの SOAP 拡張機能を使用する方が良いと考えています。まずは SOAP について理解しましょう:
1. SOAP と XML-PRC の比較
Web サービス開発の初期の頃、XML 形式のメッセージの最初の主要な用途は XML-RPC プロトコルに適用されました。リモートプロセス転送の略です。 XML リモート プロシージャ コール (XML-RPC) では、クライアントは、名前、サービスを実行しているプログラム、および入力パラメータを含む特定のメッセージを送信します。
XML-RPC は、限られたデータ型といくつかの単純なデータ構造のみを使用できます。このプロトコルは十分強力ではないと考えられたため、SOAP が登場しました。SOAP の元々の定義はシンプル オブジェクト アクセス プロトコルでした。その後、SOAP は単純なものではなく、オブジェクト指向言語を使用する必要がないことに徐々に誰もが気づき、現在では SOAP という名前だけが使われるようになりました。
XML-RPC には単純なデータ型のセットしかありません。代わりに、SOAP は XML スキーマの継続的な進化を活用してデータ型を定義します。同時に、SOAP は XML 名前空間も利用できますが、XML-RPC では必要ありません。これにより、SOAP メッセージの先頭を任意のタイプの XML 名前空間宣言にすることができますが、その代償として、より複雑になり、システム間の非互換性が生じます。
コンピューター業界の覚醒により、人々は XML ベースの Web サービスのビジネスの可能性を発見し、企業はアイデア、意見、議論、標準化の試みを継続的に模索し始めました。かつて W3C は「Web サービス活動」という名称で成果展示会を開催することができましたが、その中には実際に SOAP を作成した XML プロトコル ワーキング グループ (XML Protocol Working Group) も含まれていました。何らかの形で 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; } /** * p 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 p($a, $b){ if($b == 0){ throw new SoapFault(-1, "Cannot pide 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->addClass ではなく、$server->setClass。
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->p(8, 2); // will cause a Soap Fault if pide 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文件,此时用到math类的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 中国語 Web サイトの他の関連記事を参照してください。