ホームページ  >  記事  >  バックエンド開発  >  PHP の学習方法: PHP での SOAP の使用例と WSDL ファイルの生成、WSDL ファイルを自動的に生成するクラス ライブラリの提供??SoapDiscovery.class.php クラス

PHP の学習方法: PHP での SOAP の使用例と WSDL ファイルの生成、WSDL ファイルを自動的に生成するクラス ライブラリの提供??SoapDiscovery.class.php クラス

WBOY
WBOYオリジナル
2016-06-23 13:54:091000ブラウズ

1. Web サービスの人気: Web サービス Soap wsdl の違いについての個人的な意見

Web サービスはビジネス要件を実現します: Web サービスは、真に「サービス」を提供し、サービス インターフェイスの総称を提供します。
WSDL は、「何ができるかのドキュメント」、つまり提供されるサービスの記述形式を提供します。私はあなたを助けたいのですが、私に何ができるか、そしてそれを行うために必要なパラメータの種類を教えたいと思います。
SOAP は「リクエスト」仕様を提供します: メソッドやパラメータなどを含むリクエスト形式をサービスインターフェイスに渡します。誰かに何かをしてもらいたい場合は、SOAP が定義する「リクエスト」の形式を伝える必要があります。SOAP で定義された「リクエスト」の形式に従ってリクエストを「記述する」ことで、Web サービスが確実に実行できるようになります。何をするのか、そしてどのようなパラメータを提供するのかを正しく解釈できます。このリクエストで説明する必要がある主な問題は、リクエストを送信する Web サービス、リクエスト パラメータのタイプ、パラメータ値、および戻り値のタイプです。これらを「埋める」と、SOAP仕様に準拠したSOAPメッセージが完成します。

wsdl と soap は Web サービスの 2 つの主要な標準ですが、必ずしも接続されているわけではなく、独立して使用することもできます。
wsdl は、現在では国際的に認められた標準となっている統一インターフェイスを提供します。wsdl は、wsdl が提供するインターフェイスを介して、さまざまな種類のリソース (Java、C#、C、C、C++ など) にアクセスできます。 XML では言語プラットフォームに依存しません。さらに、wsdl は、インターフェイスを特定のサービスにバインドするためのバインディング要素とサービス要素を提供し、インターフェイスと実装の分離を実現します。

SOAP (シンプル オブジェクト アクセス プロトコル) は、リモート サービスにアクセスするために使用される http ベースの送信プロトコルです

wsdl と SOAP の関係は次のとおりです: wsDL がサービスをバインドするときに、使用するプロトコルを設定できます。 http、smtp、ftp などの任意の送信プロトコル。さらに、wsdl は jms、ejb、ローカル Java などもバインドできますが、それらはすべてバインディング要素とサービス要素を拡張する必要があり、サーバー機能を拡張する必要があります。この拡張機能

SOAP プロトコルは要求および応答プロトコルの仕様であり、http は Web 送信プロトコルです。SOAP 送信は http に基づいて行うことができますが、ftp、smtp などの他の送信プロトコルに基づいて行うこともできます。 。

Simple Object Access Protocol (SOAP) は、W3C 組織のメモであり、分散環境または分散環境で情報を交換するための軽量プロトコルについて説明しています。 SOAP は、3 つの部分で構成される XML ベースのプロトコルです。SOAP エンベロープは、メッセージの内容、送信者、メッセージを受け入れて処理する必要があるフレームワーク、および SOAP エンコーディング ルールを定義するフレームワークです。 (エンコーディング ルール) は、アプリケーションが使用する必要があるデータ型のインスタンスを表すために使用されます。SOAP RPC 表現 (RPC 表現) は、SOAP をさまざまなトランスポート プロトコル (バインディング) にバインドできます。情報を交換するための基礎となるプロトコル。このドキュメントでは、現在、SOAP が HTTP および HTTP 拡張機能にバインドされる方法のフレームワークのみが定義されています。

SOAP は、HTTP プロトコルをベースに、XML で記述された REQUEST パラメータを HTTP BODY に載せ、処理完了後に WEB SERVICE サーバー(SERVLET、ASP など)に送信します。結果も XML で RESPONSE として記述されます。クライアントの話に戻りますが、クライアントと WEB サービスを対応付けるために、この通信メソッドの記述ファイルとして WSDL を使用して、WSDL ツールを使用して自動的に生成することができます。 SOAP には、WS とクライアントのフレームワーク ファイルを XML にバンドルする機能があります。

SOAP の前身はリモート呼び出し処理プロトコルである RPC ですが、SOAP は基本プロトコルとして HTTP プロトコルを使用し、ポート 80 を使用しますが、ほとんどのファイアウォールは RPC 通信パケットをブロックします。 SOAP を透過的にし、RPC 機能を完了します。

SOAP プロトコルは HTTP プロトコルと同じであり、どちらも基礎となる通信プロトコルが異なります。SOAP パケットは XML 形式であるため、記述する際に SOAP について詳しく理解する必要はありません。ウェブサービス。 SERVICEとCLIENTが同じ環境でSOAPを使用している場合は、SOAPプログラムのフレームワークを自動生成してくれるツールがあることが多いので詳しく知らなくても問題ありませんが、CLIENTとSERVICEの環境が異なる場合は、たとえば、JAVA Client と .NET SERVICE、または TOMCAT での VB CLIENT と JAVA SERVICE については、特に WSDL や UDDI が標準ではない場合は、事前に準備する必要があります。ソープメッセージを手動で送信します。

2. クラス「SoapDiscovery.class.php」を使用して wsdl ドキュメントを生成します。

SOAP タイプのインターフェース
プログラミング言語、プラットフォームに依存せず、非常にスケーラブルです

SOAP インターフェースを実装するには 2 つの方法があります。1 つは WSDL ファイルを使用する方法、もう 1 つは WSDL ファイルを使用しない方法です。
研究が好きな人は、最初の方法を使用すると、PHP が Web サービスを作成する方法を明確に理解できるようになります。ただし、初心者にとって最初の方法は、XML 形式で WSDL ファイルを作成するのがより困難です。まず XML とは何かを理解する必要があります。 XML構文を学びましょう!しかし、問題を解決したいと思っている人にとっては!それに慣れるのにそれほど時間はありません。ということで、これは面倒なことなんです!ただし、心配しないでください。前述したように、WSDL ファイルを必要としない別の方法があります。さらに、このチュートリアルでは、WSDL ファイルを自動生成するクラスも提供します。

説明する前に、まず PHP の SOAP 環境サポートを設定します:
php.ini ファイルを見つけます
; extension=php_soap.dll
";" を削除して、Apache サーバーを再起動します

1. WSDL ファイルを使用する方法があります

最初に紹介します標準的なウェブサービス。 では、wsdl を作成するにはどうすればよいでしょうか?これは PHP にとっては確かに簡単ではありませんが、zend スタジオで作成するのが非常に便利であるという人もいます。しかし、zend studio を使いたくない人にとっては、Web サービスを作成して zend studio をインストールするのは難しすぎると感じるかもしれません。
これは簡単なメソッドです。SoapDiscovery.class.php クラスをインターネットからダウンロードします (私はローカルにダウンロードしました)。このメソッドの最後は return ステートメントです。このメソッドは変更できます:
//return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '' );
/ /wsdl ファイルを生成し、上記の return コメントを削除してから
$fso = fopen($this->class_name . ".wsdl" , "w");
fwrite($fso, sprintf('%s) %s% s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ''));
これで、wsdl を生成するクラス SoapDiscovery.class が追加されました。 .php (ソースコードは最後にあります)。
wsdl を作成するためのサービスを提供する Service.php クラス ファイルまたは関数を準備します。
class Service {

public function HelloWorld() {

return "Hello";
}
public function Add ($a , $b) {

return $a + $b;

}

}

?>


wsdl ファイルの creat_wsdl.php を以下に作成します

include("Service.php"); include("SoapDiscovery.class.php");

$disc = new SoapDiscovery('Service', 'soap'); //最初のパラメータはクラス名です (生成される wsdl ファイルにはクラス名が付けられます。例: 2 番目のパラメータはサービスの名前です (これは気軽に記述できます)
$disc->getWSDL(); ##手順: 「SoapDiscovery.class.」を参照してください。 php "ファイルのソース コードでは、このメンバー関数に対して return ステートメントが有効になっている場合、XML 形式の文字列が返されることがわかりました。$strXML = $disc->getWSDL();echo $strXML; が使用されている場合、 XML はブラウザーに表示されません。ブラウザはデフォルトで「html/text」を使用して標準出力のコンテンツを返すため、PHP スクリプトの先頭で

header("Content-type: text/html; charset=utf-8"); を使用する必要があります。ブラウザは出力を HTML としてではなく XML として解析します。
Web アクセスを使用して create_wsdl.php ファイルを実行します。このファイルは以下で使用されます。
注: 上記の方法で生成された wsdl ファイルは Windows では問題ありませんが、Linux では wsdl ファイルの「location=XXX」セクションにサーバー IP アドレスがありません。したがって、コードを $_SERVER['SERVER_NAME'] から $_SERVER['SERVER_HOST'] に変更する必要があります。これは、Linux (nginx) では、前の変数は空であり、正しい wsdl ドキュメントを生成できるためです。


Service.php ファイルにコードを追加します

class Service {

public function HelloWorld() {
return "Hello";

}


public function Add($a, $b) {
return $a + $b;

}


}

$server = new SoapServer('Service.wsdl', array('soap_version' => SOAP_1_2)); ##ここでの Service.wsdl ファイルは上記で生成されたものです

$server->setClass("Service"); //Service クラスのすべてのメソッドを登録します

$server->handle(); //リクエストを処理します

?>

Web サービス クライアント プログラムを作成します。 Web サービスは有効です。ファイル名は client.php です。
ini_set('soap.wsdl_cache_enabled', "0"); //wsdl キャッシュをオフにします

$soap = new SoapClient( 'http://localhost/Dragon/soap/Service.php?wsdl');
echo $soap->Add(28, 2);
echo $soap->__soapCall('Add',array (28, 2))//または、次のように呼び出します
#echo $soap->__Call('Add',array(28,2));

?>
OK!テストに合格しました!

2. WSDL ファイルを使用しないメソッド
サーバー側
class Service
{
public function HelloWorld()
{
return "Hello";
}
public function Add($a,$b)
{
return $a+$b;
}
}
$server=new SoapServer(null,array('uri' => "abcd"));
$server->setClass("Service");
$server- >handle();
?>
Client
try {
$soap = new SoapClient(null, array(
"location" => "http://localhost/Dragon/soap/ Service .php",
"uri" => "abcd", //リソース記述子サーバーとクライアントは対応している必要があります
"style" => SOAP_RPC,
"use" => SOAP_ENCODED
));

echo $soap-> ;Add(12, 2);
} catch (Exction $e) {
echo print_r($e->getMessage(), true);
}
?>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。