SOAPとは英語で「石鹸」を意味します。しかし、このことは、過去数年間で「Web サービス」という概念が大々的に宣伝された後、SOAP が Web サービスの実装の先駆けとなったため、その成果または「遺産」となっています。
SOAP = シンプル オブジェクト アクセス プロトコル、シンプル オブジェクト アクセス プロトコル。これは、構造化および固定化された情報を WEB 上で交換するために設計された、軽量でシンプルな XML ベースのプロトコルです。 SOAP は、ハイパーテキスト転送プロトコル (HTTP)、簡易メール転送プロトコル (SMTP)、多目的インターネット メール拡張機能 (MIME) など、多くの既存のインターネット プロトコルおよび形式と組み合わせて使用できます。また、メッセージング システムからリモート プロシージャ コール (RPC) まで、幅広いアプリケーションをサポートします。
SOAP プロトコルを通じて実装された Web サービスにより、世界中のプログラマーによって作成されたクラスと関数を集めて、言語に依存しない巨大な関数ライブラリを構築できます。これは、ネットワークが接続されている限り、これまでのプロセス間、マシン間、ネットワーク間通信の問題がすべて解決された、ソフトウェア業界の輝かしい発展の展望を示しています。 http
このプロトコルはファイアウォールを通過できます (実際、ファイアウォールは一般に http プロトコルのポート 80 をブロックしません。ブロックしないと誰もインターネットにアクセスできなくなります)。
多くの人がこのテクノロジーについて非常に楽観的であり、「エキサイティング」であると言うのも不思議ではありません。Web サービスは実装が非常に簡単で、今日のインターネット上の無数の Web プラットフォームに基づいて簡単に公開できます。多くの場合、シンプルであることが最も美しく、Web サービスはその実用的な例です。
PHP では、php.ini ファイルで php_soap.dll 拡張機能を有効にすると、SOAP をサポートできます。
SOAP 拡張ライブラリには、主に 3 種類のオブジェクトがあります。
1. SoapServer
PHP サーバーサイドページを作成するときに呼び出して応答データを返すことができる関数を定義するために使用されます。 SoapServer オブジェクトを作成するための構文形式は次のとおりです:
$soap = new SoapServer($wsdl, $array)
このうち $wsdl は shoep が使用する wsdl ファイルで、wsdl は Web サービスを記述するための標準形式です。 if $wsdl wsdl モードを使用しない場合は null に設定します。 $array は SoapServer の属性情報であり、配列です。
SoapServer オブジェクトの addFunction メソッドは、クライアントがどの関数を呼び出すことができるかを宣言するために使用されます。構文形式は次のとおりです:
$soap->addFunction($function_name);
このうち、$soap は SoapServer オブジェクトです。 、$function_name 関数名を呼び出す必要があります。
SoapServer オブジェクトの handle メソッドは、ユーザー入力を処理して対応する関数を呼び出し、最終的に処理結果をクライアントに返すために使用されます。構文形式は次のとおりです:
$soap->handle([$soap_request]);
このうち、$soap は SoapServer オブジェクトで、$soap_request はユーザーのリクエスト情報を表すために使用されるオプションのパラメーターです。 $soap_request が指定されていない場合、サーバーはユーザーからのすべてのリクエストを受け入れることを意味します。
2. SoapCliet
は、リモート サーバー上の SoapServer ページを呼び出すために使用され、対応する関数への呼び出しを実装します。 SoapClient オブジェクトを作成するための構文形式は次のとおりです:
$soap = new SoapClient($wsdl,$array);
このうち、パラメータ $wsdl と $array は SoapServer と同じです。
SoapClient オブジェクトを作成した後、サーバー ページで関数を呼び出すことは、SoapClient メソッドを呼び出すことと同じです。 作成構文は次のとおりです:
$soap->user_function($params);
このうち、$soap は SoapClient です。 object と user_function はサーバーです。呼び出される関数、$params は関数に渡されるパラメータです。
3. SoapFault
SoapFault は、SOAP アクセス中に発生する可能性のあるエラーを生成するために使用されます。 soapFault オブジェクトを作成するための構文形式は次のとおりです:
$fault = new SoapFault($faultcode,$faultstring);
このうち、$faultcode はユーザー定義のエラー コード、$faultstring はユーザー定義のエラー メッセージです。 。 soapFault オブジェクトは、サーバー側のページでエラーが発生したとき、またはユーザーが SoapFault オブジェクトを作成したときに自動的に生成されます。 Soap アクセス中に発生したエラーの場合、クライアントは SoapFalut オブジェクトをキャプチャすることで、対応するエラー情報を取得できます。
クライアントで SoapFault オブジェクトをキャプチャした後、次のコードを通じてエラー コードとエラー情報を取得できます:
$fault->faultcode;//エラー コード
$fault->faultstring;//エラー情報
ここで, $fault 前に作成した SoapFault オブジェクトです。
例:
文例soapfunc.php:
/* 几个供給クライアント端调用関数 */
function reverse($str)
{
$retval='';
if(strlen($str) <1)
{
return new SoapFault('Client','','Invalid string');
}
for($i=1; $i<=strlen($str); $i++)
{
$retval .= $str[(strlen($str)-$i)];
}
return $retval;
}
function add2numbers($num1, $num2)
{
if(trim($num1) != intval($num1))
{
return new SoapFault('Client','','最初の番号は無効です');
}
if(trim($num2) != intval($num2))
{
return new SoapFault('Client','','2 番目の数値は無効です');
}
return ($num1+$num2);
}
function gettime()
{
$time = date('Y-m-d H: i:s',time());
return $time;
}
?>
文件soapclsoapserverient.php 内容:
//先创建一SoapServer对オブジェクト例,その後将我们要公開関数数注册,
//最後のhandle()用来処理受理soap请求
include_once('soapfunc.php');
error_reporting(7); //正式公開時、設定は0
date_default_timezone_set('PRC'); //設置時間区
$soap = new SoapServer(null, array('uri'=>"httr://test-rui"));
$soap->addFunction('reverse');
$soap- >addFunction('add2numbers');
$soap->addFunction('gettime');
$soap->addFunction(SOAP_FUNCTIONS_ALL);
$soap->handle();
?>
文ファイルsoapclient .php 内容:
error_reporting(7);
try
{
$client = new SoapClient(null, array('location'=>"http://localhost:8080/_myPHP5/soap/soapserver. php", 'uri'=>"http://test-uri"));
$str="この文字列は反転されます";
$reversed = $client->reverse($str);
echo "'$str' を逆にすると、'$reversed' が得られます。";
$n1 = 20;
$n2 = 33;
$sum = $client->add2numbers($n1,$n2);
echo "
";
echo "$n1 + $n2 を試すと、$sum が得られます";
echo "
";
echo "remoye システム時間は次のとおりです: ".$client-> ;gettime();
}
catch(SoapFault $fault)
{
echo "Fault! code:" 。 $fault->faultcode 。 " 弦:" 。 $fault->faultstring;
}
?>
PHP では、WSDL を介した Web サービスの配布も実現されています。对每个Webサービス务来
WSDL ファイルは、Web サービスの位置、プロトコル、およびインターフェイスを詳細に説明するための説明ドキュメントであり、Web サービスの発行者によって提供されます。
1 タイプ定義: 言語に依存しないタイプ定義。SOAP メッセージで送信される要素情報の定義に対応します。
2 メッセージ: 各 Web メソッドは、ヘッダーと出力の 2 つのメッセージ定義に対応します。 body
3 PortType: 各 Web サービスは PortType に対応し、それに公開されるメソッドとオペレーションも含まれます。
4 Bindings: 入力の形式を含む、各ポートタイプの各オペレーション (クラスとメソッド) のバインディング情報を指定します。
5 サービス: 各 Web サービスにバインドされたポート情報
前述の例に従って公開することに加えて、Web サービスは WSDL ドキュメントを通じて公開することもできます。
例:
公開するクラス、ファイル myservice.php:
class service
{
public function HelloWorld()
{
return "Hello";
}
public function Add($a, $ b)
{
return $a+$b;
}
}
$server=new SoapServer('TestSoap.wsdl',array('soap_version' => SOAP_1_2));
$server->setClass( "サービス");
$server->handle();
?>
WSDL 記述ドキュメント、ファイル TestSoap.wsdl:
<定義名="TestSoap"
targetNamespace="urn:TestSoap"
xmlns:typens="urn:TestSoap"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns : soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http:// スキーマ.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<メッセージ名="追加">
<パート名="a"/ > ;
< /メッセージ>
<操作名="追加">
<入力メッセージ="typens:Add"/>
<出力メッセージ="typens:AddResponse " />
<入力メッセージ="typens:HelloWorld"/>
<出力メッセージ="typens:HelloWorldResponse"/>
< ;/operation>
定義>
コードの呼び出し、ファイル Client.php:
error_reporting(7);
$client = new SoapClient("http://localhost:8080/_myPHP5/soap/Wsdl/TestSoap.wsdl");
echo $client->HelloWorld() ;
echo("
");
echo $client->Add(10, 20);
?>
しかし、WSDL ドキュメントの作成は非常に面倒で、退屈で間違いが発生しやすいものです。多くの人は、このようなものは人間によって書かれたものではないと考えていますが、優れたソフトウェア ツールがあれば、このようなものは人間によって書かれる必要はありません。 Zend の ZED 5.0 シリーズと Zend Studio for eclipse 6.0 は当初、WDSL ビジュアル編集とクラス パブリッシング (クラス ファイルに従ったインテリジェントな生成) をサポートしていましたが、Zend Studio 7.0 以降、この機能は弱められました。ただし、Eclipse 上に構築されている Zend Studio 7.x には WSDL ビジュアル エディタが搭載されており、生成された WSDL の機能は十分です。 ファイルには以前から若干の変更が加えられています。プログラマは、WSDL ドキュメントのタグと要素に精通している必要があります。
付録: PHP SOAP 開発に関するいくつかのエラー
1. 開発中は、必ず PHP SOAP のキャッシュをオフにしてください。サーバーとクライアントの両方でそれが必要です。そうしないと、次のエラーが報告されます:
致命的なエラー: Uncaught SoapFault 例外: [クライアント] 関数 ("test") は……clien.php:5 のこのサービスの有効なメソッドではありませんスタック トレース:
#0 [内部関数]: SoapClient->__call('test', Array )
#1 D:xampphtdocsclien .php(5): SoapClient->test()
#2 {main}
Close メソッド:
ini_set("soap.wsdl_cache_enabled", "0");
渡すことができます$client->__getFunctions( ) やその他の Soap に関する情報を表示するメソッドのようなもの。
2. デバッグ中に XML を認識できないというエラーが報告された場合は、コード内にスペースやその他の無関係な情報 (Utf-8 でエンコードされたファイルの BOM ヘッダーなど) が含まれていないことを確認してください。
著者: Zhang Qing (ネットワーク) 西安 PHP 教育訓練センター 2010-7-11
「ネットワーク ビジョン」より: http://blog.why100000.com
著者 Weibo: http://t.qq. com/ zhangking
「十万なぜ」コンピュータ学習ウェブサイト: http://www.why100000.com
上記では、PHP での SOAP の使用法をその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。