学習教材は次のとおりです: [Wrox]Professional Open Source Web Services
Chapter 8 PHP and Web Services
英語版電子書籍ダウンロード [pdf]
全文は 3 つの部分に分かれています: 概要。 Web サービス開発における PHP の利点は、Unix システムに PHP をインストールして構成し、PHP で SOAP を使用することです。 NuSOAP ツールキット、HTTP プロキシ、SOAP over HTTPS、ドキュメント スタイル メッセージングなどの NuSOAP の高度な Web サービス機能。また、セキュリティの問題、言語とデータ型のマッピング、PHP での XML-RPC など、PHP Web サービスをプログラミングするときに遭遇するいくつかの問題を解決する方法についても説明します。 XML-RPC の特徴、XML-RPC と SOAP の比較、次に Useful, Inc. の実装を使用した XML-RPC クライアントおよびサーバー プログラムの作成について説明します。
セクション 1. 概要 PHP には、Expat パーサーをバインドすることによる XML サポートが組み込まれています。さらに、domxml (libxml ライブラリを使用して DOM、Xpath、および Xlink サポートを提供)、xslt ( Sablotron や libxslt などの複雑なサードパーティ XSLT ライブラリ用のアウトソーシング プログラム。
Web サービス開発に役立つもう 1 つの PHP 拡張機能は、CURL (Client URL Library) です。 CURL を使用すると、HTTP、HTTPS、FTP、telnet、LDAP などのさまざまなプロトコルを介して通信できます。HTTPS は、Web サービスとサーバー間の安全な接続に特に役立ちます。
SOAP と XML-RPC の長所と短所: 強力な型拡張 (SOAP) US-ASCII、UTF-8、UTF-16 などのユーザー定義の文字セット (SOAP) 受信者を指定 [コンテナーを指定しますか?] (SOAP) コンテナー理解できないメッセージを受信すると失敗する (SOAP) 使いやすい (XML-RPC) シンプルなデザイン (XML-RPC) PHP を構成する: Apache: PHP を Apache モジュールとして実行するには、--with-apxs オプションを使用します--with-apxs=/www/bin/apxs などのようにコンパイルします。 [現在 Apache2 を使用しており、コンパイルした PHP で使用されるオプションは --with-apxs2=/usr/sbin/apxs です] DOMXML: オプションの関数。XML ドキュメントの解析に非常に役立ちます。 libxml ライブラリ (バージョン>=2.4.2) を事前にインストールする必要があり、コンパイル時に --with-dom=DIR オプションが使用されます (デフォルトの DIR は /usr)
http://www.xmlsoft.org /downloads.html
libxml 2.6.4 - ソース - 2.52 MB
XSLT: オプションの機能。XML データを他のタイプのドキュメントに変換するのに役立ちます。 --enable-xslt --with-xslt-sablot オプションを使用してコンパイルします。 Sablotron XSLT ライブラリ (http://www.gingerall.com/) を事前にインストールする必要があります (デフォルトの DIR は /usr/lib または /usr/local/lib)。
Sablotron 1.0.1 - ソース - 470 KB
CURL: 前述したように、SSL サポートが提供されている場合はインストールする必要があります。 --with-curl=DIR オプションを使用してコンパイルします。 CURL ライブラリ (バージョン >=7.0.2-beta) をプレインストールすることも必要です。 [PHP はすでにインストールされています。 CURL 情報: libcurl/7.10.7 OpenSSL/0.9.7c zlib/1.1.4]
昨日から学習を続けます。今日は主に NuSOAP についてです
セクション 2. SOAP NuSOAP の概要: NuSOAP は、NuSphere Corporation (http://www.nusphere. com/
) 開発。 NuSOAP の利点の 1 つは、拡張機能ではなく純粋に PHP コードで記述されているため、幅広い用途があることです。
構造:
インストール構成: http://dietrich.ganx4.com/nusoap/ からダウンロードし、zip ファイルから nusoap.php ファイルを抽出して include ディレクトリに置き、
include('nusoap を前に追加します)スクリプト .php'); これで完了です。
例: 以下は、単純な SOAP クライアント プログラムです。
//パラメータは配列として渡す必要があります
//変数は配列形式に変換する必要があります
$parameters=array($myString);
//soapclient オブジェクトを作成します。パラメータはサーバーの URL です
$ s= newsoapclient('http://www.douzi.org/me/php_ws/soap_server.php');
//リモートメソッドを呼び出すと、戻り値は $result に格納されます
//戻り値は文字列、整数、配列などの PHP 変数の型
$result=$s->call('echoString', $parameters);
//エラー検出
if (!$err=$s->getError) ()) {
echo ' Result: '.$result; //success
} else {
echo 'Error: '.$err; }
//デバッグ、以下を含む SOAP リクエストと応答メッセージHTTP ヘッダー
echo "
//単純なサーバー
require('nusoap.php');
//新しいsoap_serverオブジェクトを作成し、リモート呼び出しを許可するメソッドを登録します
$s=newsoap_server;
$s->register('echoString');
$s->register('echoArray');
/*
[記事には次のように書かれています: 登録ステップなしで、任意の PHP 関数をリモートで作成できます。通話はセキュリティ上の大きなリスクとなります。でも登録は必須だということで試してみました。また、結果を返す関数のみをリモート メソッドとして直接宣言できます。たとえば、echo() は機能しませんが、strto lower() は機能します。 ]
*/
function echoString($inputString) {
//クラス性チェック
if(is_string($inputString)) {
return "Hello, ".$inputString; } else {
//soap_fault クラスが使用される Generateエラーメッセージ
return newsoap_fault('client', '', 'このサービスへのパラメータは文字列である必要があります。')
//soap_fault(faultcode,aultactor,faultstring,faultdetail); //上記はエラー処理です。クラス コンストラクターの形式
//faultcode は値である必要があります。クライアントまたはサーバーに設定して、どちら側でエラーが発生したかを示すことができます。
//faultactor はまだ NuSOAP に実装されていません。
//障害文字列のエラー メッセージ。
//faultdetail 詳細なエラー情報。 XML タグを使用できます。
//コンストラクターに加えて、soap_fault クラスには、serialize() メソッドもあります
//エラー メッセージをシリアル化し、完全な SOAP メッセージを返します。例:
/*
$fault = newsoap_fault(' client ', '', 'inputString パラメータは空であってはなりません');
echo $fault->serialize();
*/
}
}
// 配列型の使用方法を示します
function echoArray($inputString) ) {
return $inputString[0]."+".$inputString[1];
}
//最後のステップは、受信したすべての POST データを SOAP サーバーのサービス メソッドに渡すことです。リクエストを処理し、適切な関数を呼び出します。
$s->service($HTTP_RAW_POST_DATA);
?>
複雑なデータ型の使用: 配列。生成された SOAP の本体コードは次のとおりです。
string1
string2
soapval を使用して、複合データ型 (複合型のサンプル) を生成します。生成された SOAP の本体コードは次のとおりです:
Alaska
12345
1234567890
0987654321
プログラム例:soapval.phpの実行
$address=array(
'street'=>'123 Freezing Lane',
'city'=>'Nome',
'state'=> ' アラスカ',
'zip'=>12345,
'電話番号'=>array('home'=>'1234567890', 'mobile'=>'0987654321')
$s= newsoapval('myAddress', 'address', $address, '', 'http://myNamespace.com');
print "<xmp>".$s->serialize()."> ";
?>
WSDL WSDL は、Web サービスを記述するために使用される XML 言語です。これは、サービスにアクセスするために必要なすべての情報を Web サービス クライアントに提供する機械可読形式です。 NuSOAP は、特に WDSL ファイルを解析し、そこから情報を抽出するクラスを提供します。 soapclient オブジェクトは、開発者がサービスを呼び出すのを容易にするために wsdl クラスを使用します。 WSDL 情報を利用してメッセージを作成することにより、プログラマは、それを呼び出す操作の名前とパラメータを知るだけで済みます。
NuSOAP 経由で WSDL を使用すると、次の利点があります: 名前空間、エンドポイント URL、パラメーター名などのすべてのサービス メタファイルを WSDL ファイルから直接取得できるため、クライアントのダイナミクスがサーバー側の変更に適応できます。このデータは常にサーバーから利用できるため、このデータをユーザー スクリプトにハードコーディングする必要はなくなりました。 これにより、soap_proxy クラスを使用できるようになります。このクラスは、soapclient クラスから派生し、WDSL ファイルで詳細に説明されている操作に対応するメソッドを追加します。ユーザーはそれを通じてこれらのメソッドを直接呼び出すことができるようになりました。 soapclient クラスには、soap_proxy クラスのオブジェクトを返す getProxy() メソッドが含まれています。 soap_proxy クラスは、soapclient クラスから派生し、WSDL ドキュメントで定義された操作に対応するメソッドを追加し、ユーザーがエンドポイントのリモート メソッドを呼び出せるようにします。これは、soapclient オブジェクトが WDSL ファイルで初期化されている場合にのみ適用されます。長所はユーザーにとっての使いやすさですが、短所はパフォーマンスです (PHP でのオブジェクトの作成には時間がかかります)。そして、この機能は実用的な目的には役立ちません。
例: wsdl.php の実行
//wsdl の簡単なデモ ファイル
include('nusoap.php');
// SOAP ソースはスターの誕生日と死亡日を提供するサービスです
//まず、soapclient オブジェクトを作成し、WSDL ファイルの URL をコンストラクターに渡します。
//渡したものが SOAP エンドポイントではなく WSDL であることをクライアントが認識できるように、2 番目のパラメーターを後で使用する必要があります。
$s=newsoapclient('http://www.abundanttech.com/webservices/deadoralive/deadoralive.wsdl', 'wsdl');
//プロキシ クラスを生成します
$p=$s->getProxy( );
//リモート関数を呼び出す
$sq=$p->getTodaysBirthdays();
if (!$err=$p->getError()) {
print_r($sq) }; {
print "ERROR: $err"; }
print 'REQUEST:<xmp>'.$p->request.'</xmp>';
print 'RESPONSE:<xmp>'.str_replace(' ><', ">n<", $p->response).'</xmp>'
?>
添付: 便利な Web サービスのデモ サイト: http:// www.mindreef.net/soapscope/wsdldemo
これは最後のセクションですが、PHP は依然としてクライアントに非常に適していると感じます。このセクションでは主に XML-RPC について説明します。
私はかつて XML-RPC の学習ノートを持っていましたが、その内容はこれと非常によく似ていました。
セクション 3. XML-RPC XML-RPC データ型
XML-RPC は、限られた数のデータ型のみをサポートします。 PHP データ型との対応関係は次のとおりです。
Useful Inc. XML-RPC 実装 -- phpxmlrpc
使用する XML-RPC ツールキットは Useful, Inc. の Edd Dumbill によって作成されており、ダウンロード URL は http: // phpxmlrpc.sourceforge.net/、これにはクライアントとサーバーの XML-RPC 実装が完全に含まれています。
クライアントとサーバーはそれぞれ xmlrpc_client クラスと xmlrpc_server クラスによって実装され、主に XML-RPC メッセージの送受信に使用されます。 xmlrpcval クラスは、PHP 変数を XML-RPC と同等のデータ型にエンコードし、パラメーターをリモート メソッドに渡すために使用されます。反対のプロセスでは xmlrpc_decode() 関数を使用します。 XML-RPC メッセージは、xmlrpcmsg クラスを使用してパラメータ リストを渡すことによって作成されます。
xmlrpc_client クラスは、xmlrpcmsg クラスを使用して作成された XML-RPC メッセージを送信します。サーバー側では、xmlrpc_server クラスがこれらの受信メッセージを xmlrpcmsg オブジェクトに解析します。このオブジェクトは、単一のパラメーターとしてユーザー関数に渡されます。この関数は、xmlrpc_server クラスによってシリアル化されてクライアントに返されるために使用される xmlrpcresp オブジェクトを返す必要があります。この基本的なアーキテクチャを次の図に示します。
インストールと構成
http://phpxmlrpc.sourceforge.net/ からダウンロードして解凍し、xmlrpc.inc と xmlrpcs.inc をインクルード パスに配置します。
次の include ステートメントをクライアント プログラムのヘッダーに追加するだけです:
include('xmlrpc.inc');
次の include ステートメントをサーバー プログラムのヘッダーに追加するだけです:
include('xmlrpc.inc' );
include(' xmlrpcs.inc'); //サーバー側コード
例
XML-RPC クライアント: xmlrpc_client.php の実行
//xmlrpc_client.php
//XML-RPC クライアント デモ プログラム
require('xmlrpc.inc');
//クライアント オブジェクトを作成します。3 つのパラメータはパス、ホスト名、ポートです
$s=new xmlrpc_client ( '/xmlrpc/xmlrpc_server.php', 'www.windix.local', 80);
//変数のエンコードを可能にする xmlrpcval オブジェクトを作成します
//PHP 変数を XML 形式としてエンコードする xmlrpcval オブジェクトを作成しますXML-RPC で必要です
$inputString=new xmlrpcval('world', 'string');
//パラメータの配列を作成します
//パラメータは 1 つだけですが、配列に変換する必要があります。 xmlrpcmsg の 2 番目のパラメーターはパラメーター テーブルであるため
$parameters=array($inputString);
//メッセージ オブジェクトを作成します
//XML-RPC メッセージを作成します。パラメーターはリモート メソッド名とパラメーター テーブルです
$ msg =new xmlrpcmsg('echoString', $parameters);
//メッセージを送信し、応答を取得します
//メッセージを送信し、戻り値 $rsp は、次の 3 つのメソッドを含む xmlrpcresp オブジェクトです。 /faultCode () エラー コード、成功した場合は 0 が返されます
//faultString() エラー メッセージ
//value() 戻り値は、xmlrpcval オブジェクトの形式で存在し、PHP で使用する前にデコードする必要があります
$ rsp=$s->send( $msg);
// エラーをチェック
if($rsp->faultcode()==0) {
// PHP タイプへの応答をデコードします
// xmlrpc_decode () 関数は xmlrpcval オブジェクトをデコードするために使用されます
$response=xmlrpc_decode($rsp->value());
// 結果を出力します
var_dump($response); } else {
//エラーを表示
print 'Error: '.$rsp->faultcode().', '.$rsp->faultstring().'
}
// メッセージを表示
//それではメッセージの内容を確認してみましょう
$msg->createpayload();
print 'REQUEST:<xmp>'.$msg->payload.'</xmp>'; '.$rsp->serialize().'</xmp>';
XML-RPC サーバー: 'xmlrpc.inc');
//文字列をエコーするサービス
//リモート呼び出しを処理するためのカスタム関数
//この関数は、xmlrpcmsg オブジェクト型のパラメータが存在する必要があり、これのみが可能であることに注意してください
function echoString($msg) {
//パラメータを navtive 型にデコードします
//最初に xmlrpc_decode 関数を使用してデコードします
$inputString=xmlrpc_decode(array_shift($msg->params)) ;
//データ型が正しい
if(is_string($inputString)) {
return new xmlrpcresp( new xmlrpcval('Hello, '.$inputString, 'string') );
} else { //またはエラーを返す
return new xmlrpcresp(0) , $xmlrpcerruser+1, "パラメーターの型 ".gettype($inputString)" が予期された型と一致しません。");
}
}
/ / サーバー オブジェクトをインスタンス化し、関数を登録します
// サーバー オブジェクトを初期化し、関数を登録します
//以下の配列は「ディスパッチ マップ」と呼ばれ、出力関数名の主キーを持つ項目は別の配列です
// 次の 3 つのメンバーが含まれます:
// function 関数の名前ここで実際に呼び出される関数名もサービス名と同じ echoString です
// 署名はオプションです。入力パラメータと出力パラメータのタイプ。最後のパラメータは出力パラメータ、前のパラメータは入力パラメータです
// docstring はオプションです。サービスのドキュメントが含まれており、HTML コンテンツを含めることもできます。
//xmlrpc_server には 2 番目のオプションの初期化パラメータも含まれています。0 に設定すると、サービスはリクエストをすぐに処理しません
//実行するにはサーバーの service() メソッド プロセスを使用する必要があります
$s=new xmlrpc_server ( array(
'echoString' => array(
'function' => 'echoString',
'signature' => array( array('string','string') ),
'docstring' => ; 'このサービスは Hello+input をエコーします
) )) >