| 開発者 | ロバート・ヴァン・エンゲレン |
|---|---|
| 初回リリース | 2000年12月8日 |
| 安定リリース | 2.8.131 / 2023年9月23日 |
| リポジトリ |
|
| 書かれた | CおよびC++ |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | Web開発ソフトウェア |
| ライセンス | GPL v2、商用ライセンス |
| Webサイト | https://www.genivia.com/dev.html https://sourceforge.net/projects/gsoap2/ |
gSOAP [1] [2]は、 SOAP / XML Webサービスおよび汎用XMLデータバインディング用のCおよびC++ソフトウェア開発ツールキットです。C/C++型宣言のセットが与えられると、コンパイラベースのgSOAPツールは、指定されたCおよびC++データ構造の効率的なXMLシリアル化のために、ソースコード内にシリアル化ルーチンを生成します。シリアル化にはゼロコピーのオーバーヘッドがかかります。
歴史
gSOAP ツールキットは、 1999 年にフロリダ州立大学のRobert van Engelen 教授による研究プロジェクトとして始まりました。このプロジェクトでは、非常に効率的な XML 解析 (プル解析) [3] [4]と、C/C++ データをXMLで直接シリアル化し、後にSOAPでもシリアル化する新しい方法[2]が導入されました。このプロジェクトは、XML スキーマ型とさまざまなC/C++ データ型の間の型安全なデータ バインディングを定義することに成功しました[5]。このツールキットでは、自動プログラミングを使用して、効率的な自動生成 XML シリアライザーを使用して C/C++ データを直接送受信することにより、Web サービスの開発と呼び出しを簡素化しています。ドメイン固有のコンパイラ ベースのツールは、ネイティブ C/C++ データ構造を XML に、またその逆に効率的に変換するソース コードを生成します[1] 。このツールキットは、ほぼ同時期に導入された SOAP Web サービス メッセージング プロトコルをサポートするためにさらに開発され、「gSOAP」( generic XML and SOAP ) という名前が付けられました。[6]このソフトウェアのさらなる開発と保守は Genivia Inc. の所有下で行われました。これには、新しいWSDLおよびXML スキーマ処理機能の追加、WS-Security 最適化などの多くの WS-* Web サービス プロトコル機能の追加、[7] XML-RPCメッセージング、 JSONデータ形式のサポート、Apache および IIS Web サーバーに gSOAP を統合するためのプラグイン モジュール、Grid Services などのサードパーティ プラグインが含まれます。[8] [9] gSOAP ツールキットは移植可能な C/C++ で記述されており、独自のコードを生成することでブートストラップ形式を使用し、WSDL/XSD 仕様を WSDL/XSD メタデータ バインディングの C/C++ ソース コードに変換するコンバーターを実装します。gSOAP ソフトウェアは、GPLv2 オープン ソース ライセンスと商用利用ソース コード ライセンスの下でライセンスされます。gSOAP ソフトウェアは、産業プロジェクト[10]やミッション クリティカルなインフラストラクチャで広く使用されています。
XML Web サービス操作の例
宿泊人数からホテルの宿泊料金を取得するC言語のWebサービス操作の例は、注釈付き形式で次のように宣言できます。
//gsoap ns サービス名前空間: tempuri
//gsoap ns サービス スタイル: document
//gsoap ns サービス エンコーディング: リテラル
int ns__get_rate ( char * hotel , int guests , float * rate );
関数の最後のパラメータは常にサービス戻り値であり、一方向操作の場合は void として表すことができ、複数のサービス戻りパラメータをバンドルするには構造体/クラスである必要があります。関数の int 戻り値は、エラー診断に使用されます。
自動生成された soap_call_ns__get_rate 関数を使用した C でのサービス呼び出しは、次のように実行されます。
const char * URL = "http://www.example.com/hotels" ; const char * action = NULL ; struct soap * ctx = soap_new (); // 新しいコンテキストfloat rate ; int err = soap_call_ns__get_rate ( ctx , URL , action , "Happy Inn" , 2 , & rate ); if ( err == SOAP_OK && rate < 100.00 ) lets_go (); soap_end ( ctx ); // デシリアライズされたデータの割り当てを解除soap_free ( ctx ); // コンテキストの割り当てを解除
従来の C および C++ システムでの Web サービスの実装を容易にするために、C/C++ の識別子名のプレフィックス修飾を省略したり、コロン表記に置き換えたりすることができます (例: ns__get_rate ではなく ns:get_rate)。プロジェクト ビルドで使用される自動生成されたソース コードでは、句読点は削除されます。
自動生成された Proxy クラスを使用した C++ でのサービス呼び出しは、次のように実行されます (Proxy のデフォルトのエンドポイント URL と SOAP アクション値を使用)。
プロキシproxy ; float rate ; int err = proxy.get_rate ( "Happy Inn" , 2 , & rate ); if ( err == SOAP_OK && rate < 100.00 ) lets_go ( ); proxy.destroy (); // デシリアライズされたデータの割り当てを解除
注釈と識別子の命名規則、つまり関数 ns__get_rate のプレフィックス ns__ による修飾を使用し、例の //gsoap ディレクティブを使用して ns 名前空間のプロパティを宣言することにより、Web サービス操作へのバインディングが確立されます。自動生成された Web サービス記述言語 (WSDL) ドキュメントは、次のように、ns__get_rate 関数の要求メッセージ、応答メッセージ、get-rate 操作 portType インターフェイス、および SOAP バインディングを宣言します。
<定義名= "Service" targetNamespace= "tempuri" xmlns:tns= "tempuri" xmlns:ns= "tempuri" xmlns= "http://schemas.xmlsoap.org/wsdl/" >
...
<メッセージ名= "get-rateRequest" > <パーツ名= "パラメータ"要素= "ns:get-rate" /> </メッセージ> <メッセージ名= "get-rateResponse" > <パーツ名= "パラメータ"要素= "ns:get-rateResponse" /> </メッセージ>
<portType名 = "ServicePortType" > <operation名 = "get-rate" > <input message = "tns:get-rateRequest" /> <output message = "tns:get-rateResponse" /> </operation> </portType>
<binding name= "Service" type= "tns:ServicePortType" > <SOAP:binding style= "document" transport= "http://schemas.xmlsoap.org/soap/http" /> <operation name= "get-rate" > <SOAP:operation soapAction= "" /> <input> <SOAP:body parts= "parameters" use= "literal" /> </input> <output> <SOAP:body parts= "parameters" use= "literal" /> </output> </operation> </binding>
ここで、操作の要求メッセージと応答メッセージは、次のように WSDL の型セクションで定義されている XML 要素を参照します。
<types>
<schema targetNamespace= "tempuri" ... > <element name= "get-rate" > <complexType> <sequence> <element name= "hotel" type= "xsd:string" minOccurs= "0" maxOccurs= "1" nillable= "true" /> <element name= "guests" type= "xsd:int" minOccurs= "1" maxOccurs= "1" /> </sequence> </complexType> </element> <element name= "get-rateResponse" > <complexType> <sequence> <element name= "rate" type= "xsd:float" minOccurs= "0" maxOccurs= "1" nillable= "true" /> </sequence> </complexType> </element> </schema> </types>
同様に、クライアントとサーバーの C/C++ ソース コードは、WSDL と XML スキーマのセットから自動生成できます。サービスは、適切なサービス操作を定義して完了する必要があります。たとえば、この WSDL の自動生成された C++ サービス クラスは、次のように get_rate メソッドを定義して完了する必要があります。
int Service::get_rate ( char * hotel , int guests , float * rate ) { * rate = ... // 宿泊人数に基づいてホテルの宿泊料金を決定します。return SOAP_OK ; }
Web サービス メッセージング用に XML でマーシャリングできる操作パラメータの型には制限はありませんが、データ バインディングを確立するには、特定の型宣言規則と注釈に従う必要があります。
XML データバインディングの例
C/C++ データ型との XML データ バインディングを確立するために、gSOAP は、ディレクティブ、識別子命名規則、句読点という 3 つの基本的な形式のソース コード注釈を使用します。
階層的な従業員レコードのC言語による完全な注釈付き構造宣言は、次のようになります。
//gsoap ns スキーマ名前空間: tempuri
//gsoap ns スキーマ形式: 修飾
struct ns__employee_record { @ char * xml__l ang = "en" ; @ int ID = 9999 ; char * full_name 1 : 1 ; $int size 0 : 12 ; struct ns__employee_record * manages ; };
ここでは、次の注釈と規則が使用されます。
- 識別子命名規則による型とメンバーの名前空間修飾: ns__employee_record、xml__lang
- メンバーの属性: @char*、@int
- メンバーのデフォルト値: xml__lang = "en", ID = 9999
- XML 検証のminOccurs : maxOccurs形式の出現制約: full_name 1:1、サイズ 0:12
- 要素シーケンスの動的配列は、特別なサイズフィールドと配列ポインタメンバーのペアで構成されます: $int size; struct ns__employee_record *manages
gSOAP ツールは、C/C++ データ型を XML スキーマ データ型に変換します。C は名前空間をサポートしておらず、構造体/クラス メンバー名を C++ で名前空間修飾できないため、gSOAP の識別子命名規則を使用すると、この構造体とそのメンバーを次のように自動生成される XML スキーマ complexType にバインドできます。
<スキーマtargetNamespace= "tempuri" xmlns:ns= "tempuri" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" xmlns= "http://www.w3.org/2001/XMLSchema" elementFormDefault= "qualified" attributeFormDefault= "qualified" >
<complexType name= "employee-record" > <sequence> <element name= "full-name" type= "xsd:string" minOccurs= "1" maxOccurs= "1" nillable= "true" /> <element name= "manages" type= "ns:employee-record" minOccurs= "0" maxOccurs= "12" /> </sequence> <attribute ref = "xml:lang " use= "default" default= "en" /> < attribute name= "ID" type= "xsd:int" use= " default" default = "9999" /> </complexType>
</スキーマ>
さらに、共用体メンバー選択用の特別なセレクター フィールドで注釈が付けられた構造体/クラス内の共用体は、スキーマ選択パーティクルに/からマップされ、STL コンテナーはシーケンス パーティクルに/からマップされ、列挙体は XML スキーマ simpleType 列挙体に/からマップされ、標準 C/C++ プリミティブ型は XSD 型に/からマップされます。XSD スキーマから C/C++ データ型への変換では、実際のマッピングは、型マッピング ファイルを使用して gSOAP で構成できます。
階層的な従業員構造の例のインスタンスは、デフォルトではツリーとしてXMLでシリアル化されます。たとえば、
<ns:employee xmlns:ns= "tempuri" xml :lang= "en" ns:ID= " 12 " > <ns:full-name>ジェーン・ドウ</ ns:full-name> <ns :manages xml:lang= "en" ns:ID= "34" > <ns : full - name >ジョン・ドウ</ns:full-name> </ns:manages> <ns:manages xml:lang = "en" ns:ID = " 56" > <ns:full -name >ボブ・オズ</ns:full-name> <ns :manages xml:lang= "en" ns:ID= "78" > <ns:full-name >アリス・オズ</ns:full-name> </ns:manages> </ns:manages> </ns:employee>
SOAP エンコーディング スタイルが有効になっている場合、gSOAP の XML シリアル化では、SOAP エンコーディング ルールに従って共参照オブジェクトと循環データ構造が考慮され、id-refエッジを持つ XML が生成されます。
自動生成された XML データ バインディングには、ファイル、文字列、またはストリームに対する読み取りおよび書き込み操作が含まれます。たとえば、ns__employee_record オブジェクトには読み取りおよび書き込み操作があります。
int soap_read_ns__employee_record (構造体soap * 、ns__employee_record * ); int soap_write_ns__employee_record (構造体soap * 、const ns__employee_record * );
XML ファイルから従業員レコードを読み取るには:
struct soap * ctx = soap_new (); ctx -> recvfd = open ( "employee.xml" , O_RDONLY ); if ( ctx -> recvfd ) { ns__employee_record employee ; if ( soap_read_ns__employee_record ( ctx , & employee ) == SOAP_OK ) ... close ( ctx -> recvfd ); } soap_end ( ctx ); soap_destroy ( ctx ); // 従業員データも削除しますsoap_free ( ctx );
解析された XML は、データ バインディングの制約に対して内部的に検証されます。
XML REST API
アプリケーション データは、REST XML サービスとの間で送受信できます。XML データ バインディングは、REST XML API 呼び出しを提供します。たとえば、前のセクションの ns__employee_record XML データ バインディングの場合、次の GET、PUT、および POST 操作が自動的に生成されます。
int soap_GET_ns__employee_record (構造体soap * 、const char * URL 、ns__employee_record * ) ; int soap_PUT_ns__employee_record (構造体soap * 、const char * URL 、const ns__employee_record * ); int soap_POST_send_ns__employee_record (構造体soap * 、const char * URL 、const ns__employee_record * ); int soap_POST_recv_ns__employee_record (構造体soap * 、ns__employee_record * );
POST 関数は一緒に呼び出す必要があります。最初に POST_send を呼び出して XML データをエンドポイント URL に送信し、次に POST_recv を呼び出して応答データ (異なるタイプの場合もあります) を受け入れます。
受信した XML は、データ バインディングの制約に対して内部的に検証されます。
特徴
- ソースからソースへのコード生成による自動プログラミングに基づく C および C++ のXML データ バインディング
- ANSI C および ISO C++ でのカスタマイズ可能なクライアント/サーバー ソース コードの自動生成
- XML検証機能を備えた、高速でスキーマ固有のXMLプル解析を統合
- Web サービス記述言語(WSDL) 1.1 および 2.0
- Web サービスSOAP 1.1 および 1.2
- ストリーミングメッセージ転送最適化メカニズム(MTOM) と DIME/MIME 添付ファイル
- 表現状態転送(REST) HTTP(S) 1.0/1.1
- WS-I Basic Profile 1.0a、1.1、1.2 に準拠していることが検証済み
- データバインディング用の検証済み W3C スキーマパターン、完全なテストパターンカバレッジ
- C および C++ 用のXML-RPC
- C および C++ 用のJSON
- RSS 0.91、0.92、2.0
- WS-セキュリティ
- WS-Policy 1.2、1.5、およびWS-SecurityPolicy 1.2
- WS-アドレス指定2003/03、2004/03、2005/03
- WS-ReliableMessaging 1.0 および 1.1
- WS-ディスカバリ1.0/1.1
- UDP 経由の SOAP
- ユニバーサル記述検出および統合(UDDI) v2 API
- HTTP 基本認証とダイジェスト認証、NTLM 認証、プロキシ認証
- SSL/TLS を使用した IPv4 および IPv6、SSL セッション キャッシュ ( OpenSSLまたはGNUTLSベース)
- gzipによる XML 圧縮
- Apache 1.x および 2.0 モジュール、IIS ISAPIおよびWinInetモジュール、CGI および FastCGI
- スタンドアロン Web サーバーのサポート (マルチスレッド、プーリング)
- 割り当て解除とリーク検出を備えた統合メモリ管理
- 追加機能のためのプラグインを備えたアーキテクチャ
- 国際化/ローカリゼーションのサポート (UTF8、UCS4、MB エンコーディングなど)
- プラットフォームに依存せず、小型デバイスをサポート (Symbian、VxWorks、Android、iPhone)
参考文献
- ^ ab van Engelen, Robert (2008). 「C および C++ Web サービス コンポーネントを使用したサービス指向コンピューティングのフレームワーク」. ACM Transactions on Internet Technology . 8 (3): 106–115. doi :10.1145/1361186.1361188. S2CID 10240041.
- ^ ab van Engelen, Robert; Gallivan, Kyle (2002). Web サービスおよびピアツーピア コンピューティング ネットワーク用の gSOAP ツールキット。IEEE 国際クラスタ コンピューティングおよびグリッド シンポジウム。pp. 128–135。
- ^ Head, Michael; Govinderaju, Madhu; Slominski, Aleksander; Liu, Pu; Abu-Ghazaleh, Nayef; van Engelen, Robert; Chiu, Kenneth (2005).グリッド Web サービスにおけるアプリケーション向け XML プロセッサのベンチマーク。IEEE/ACM Supercomputing (SC).
- ^ Head, Michael; Govinderaju, Madhu; van Engelen, Robert; Zhang, Wei (2006).グリッド Web サービスにおけるアプリケーション向け XML プロセッサのベンチマーク。IEEE/ACM Supercomputing (SC).
- ^ van Engelen, Robert; Govindaraju, Madhu; Zhang, Wei (2006). XML Web サービスにおけるリモート オブジェクトの一貫性の調査。International Conference on Web Services (ICWS). pp. 249–256。
- ^ van Engelen, Robert (2003). 「Web サービスによる SOAP エンベロープの推進、科学計算向け」、Web サービスに関する会議 (ICWS)、pp. 346–354。
- ^ Robert, van Engelen; Zhang, Wei (2008). Web サービス セキュリティ パフォーマンス最適化の概要と評価IEEE International Conference on Web Services (ICWS). pp. 137–144.
- ^ Aloisio, Giovanni; Cafaro, Massimo; Epicoco, Italo; Lezzi, Daniele; van Engelen, Robert (2005). gSOAP の GSI プラグイン: セキュリティ、パフォーマンス、信頼性の強化。国際情報技術会議 (ITCC)。pp. 304–309。
- ^ Cafaro, Massimo; Lezzi, Daniele; Fiore, Sandro; Aloisio, Giovanni; van Engelen, Robert (2007). gSOAP の GSI プラグイン: グリッド間で相互運用可能なセキュア グリッド サービスの構築。国際並列処理および応用数学会議 (PPAM) 2007、グリッド対応コンピューティング環境のモデル、アルゴリズム、および方法論に関するワークショップ (MAMGCE)、Springer Verlag LNCS 巻 4967。pp. 894–901。
- ^ Challener, David; Yoder, Kent; Catherman, Ryan; Safford, David; Van Doorn, Leendert (2007)。信頼できるコンピューティングの実践ガイド。Pearson Education。
参照
- gSOAP を使い始める
- SourceForgeのプロジェクトページ
- XMLデータバインディング
- シリアル化
- Webサービスフレームワークのリスト
- ウェブサービス仕様一覧
