Webサービス
用語
Webサービス
- OS/言語に依存しない部品を提供するサービス
- 自己完結した疎結合なビジネスロジックをWeb上に展開したもの
- クライアントプログラムのプラットフォームや開発言語に関係なく利用可能
- かなり曖昧な言葉で時と場合によって解釈がことなる。
- Webサービスの3者モデル
- プロバイダ、ブローカ、リクエスタ
- WSDL、SOAP、UDDI
WSDL(Web Services Description Language)
- Webサービスの仕様記述言語
- XMLベース
SOAP(Simple object Access Protocol)
- WSDLに基づいてデータを交換するためのプロトコル
- SOAP over HTTP、SOAP over SMTP などなど
SOAP over HTTP
- 下位レイヤにHTTPを使ったSOAP
- HTTPであるがゆえのメリット/デメリット
- Webの為に構築された既存のインフラをそのまま利用可能
- 従って容易にファイアウォールを越えることが可能
- ステートレス(リクエストをまたがって状態を維持できない)
- 信頼性が保証されない(往復の伝送路のどこで異常がおきたか判断できない)
- 信頼性はアプリケーション側での実装が必要
SOAP-RPC
- SOAPを使ってRPC(Remote Procedure Call)を行う
Webサービスに至るまでの技術経緯
- マイクロソフト(1企業独自仕様)
- DCOM(Distributed Component Object Model)
- MIDL(Microsoft Interface Definition Language)
- OMG(1団体独自仕様)
- CORBA
- IDL(Interface Definition Language)
- いずれもインターネット標準には至らず。。。
- インターネット標準としてのWebサービスへの期待
WebアプリとWebサービス
- Webアプリ
- 「WWWブラウザ:IEなど」と「WWWサーバ(Webアプリ):CGI,ASP,Servlet,JSP,PHPなど」
- HTTPで通信
- 人間による対話操作を前提としている為、主にB2C(Business to Consumer)向け
- B2Cなのでトランザクションは少ない
- Webサービス
- 「リクエスタ(クライアントプログラム)」と「プロバイダ(Webサービス)」
- SOAPで通信
- B2B(Business to Business)、B2G(Business to Govemment)向け
- B2Bなのでトランザクションは多い
SOAP
2つの形式
- ドキュメントリテラル形式
- SOAP-RPC形式
SOAP1.1仕様
- http://www.w3.org/TR/SOAP/
- http://www.research.ibm.com/trl/projects/xml/SOAP1.1-j-ibm-revision2.html(日本語訳)
SOAPメッセージの流れ
+----------+ SOAPメッセージ(リクエスト)+----------+ | |---------------------------->| | |リクエスタ| |プロバイダ| | |<----------------------------| | +----------+ SOAPメッセージ(レスポンス)+----------+
SOAPメッセージの構造
SOAPメッセージ +-------------------------------------------------+ |プロトコルヘッダ | | →HTTP等のトランスポートプロトコル固有ヘッダ | +-------------------------------------------------+ |SOAPエンベロープ | | →XMLベースの記述 | | +----------------------------+ | | |SOAPヘッダ(オプション) | | | | : | | | +----------------------------+ | | |SOAPボディ | | | | : | | | +----------------------------+ | +-------------------------------------------------+
SOAPフォルト
SOAPメッセージのやり取りにおいて、エラーが発生したときにSOAPボディに記述されるエラー
SOAPエンコーディング
開発言語(Java,VB,Cなど)のオリジナルの型変数を、言語に依存しない型に相互変換する。
- 単純型
- Integer型
- String型など
- 列挙
- バイト列
- 複合型
- 構造体
- 配列
SOAP over HTTP
トランスポートプロトコルにHTTPを使ってSOAPを実現
+----------------------------+ |HTTPプロトコルヘッダ | | POST hogeService HTTP/1.1 | | : | +----------------------------+ |SOAPエンベロープ | | : (XMLで記述) | +----------------------------+ || || +----------+ SOAPメッセージ(リクエスト)+----------+ | |---------------------------->| | |リクエスタ| |プロバイダ| | |<----------------------------| | +----------+ SOAPメッセージ(レスポンス)+----------+ || || +----------------------------+ |HTTPプロトコルヘッダ | | HTTP/1.1 200 OK | | : | +----------------------------+ |SOAPエンベロープ | | : (XMLで記述) | +----------------------------+
SOAP-RPC
ローカルマシンのプロシジャコール(LPC)を、ネットワーク経由のプロシジャコール(RPC)に拡張する為の仕組み
ミドルウェアを使用することで、アプリケーションから見ればあたかもLPCと同等の手順でRPCが可能となる。
ans = method(p) ↑ ↓ SOAPミドルウェア ↑ ↓ SOAPメッセージ ↑ ↓ SOAPミドルウェア ↑ ↓ public String method(String S){...}
SOAPのセキュリティ
- SOAP over HTTP
- HTTPのセキュリティ使用をそのまま利用
- RFC2617:Bsaic認証、Digest認証
- RFC2246:TLS/SSLによる伝送路の暗号化
- HTTPは Point to Point プロトコルである為、End to End で一環したセキュリティは確保できない。
- WS-Security
- SOAPメッセージそのものにセキュリティを施す仕様
- SOAPエンベロープはXMLである為、XMLの署名・暗号化の仕様を利用
- Microsoft、IBM、Verisignが策定したWebサービスセキュリティに関する標準化仕様
- SOAP Security Extensions: Digital Signature
- SOAPメッセージにデジタル署名を施す仕様
- 今後は、WS-Securityによるデジタル署名が標準になってゆく。
SOAPの添付ファイル
大きな画像や動画などの大容量バイナリをやり取りする場合、SOAPエンベロープにバイト配列を記述する方法では、エンベロープが巨大化し処理時間が増加する問題がある。
そこで、エンベロープとバイナリデータを分離することが求められる。
仕様乱立気味っぽい・・・?
- SOAP Messages with Attachments
- W3Cノート
- 電子メールで使われているマルチパートMIME(RFC2387)を利用
- DIME+WS-Attachments
- Microsoft、IBM策定
- DIME:バイナリデータの表記法?
- WS-Attachments:SOAPメッセージにデータを付加するための仕様
WSDL
Webサービスの仕様を記述する為の仕様
WSDL文書の構造
Webサービスの仕様は以下の構造で定義される。
→「プロバイダがどのようなサービスを提供しているのか?」をXMLで表記する為のルール
→かなり汎用的に記述できる仕様で、かつXMLで記述するので、概念の理解に時間かかった?
→関数であればCallに対して戻り値が返るという暗黙のルールがあるが、WSDLではこれすらも最初から定義する必要がある。
→SOAP-RPCの場合、Call(リクエスト)と戻り値(レスポンス)の2メッセージがあると考える。(message要素)
→抽象的な仕様を「message,portType」で定義し、実際にどのような仕組み(プロトコルなど)でサービスを提供するのかを「binding,service」で定義する。
→定義が入れ子になっているので複雑だが、入れ子部分は「impl:hogehoge」となっているので「impl:」をキーにつながりを見るとわかりやすいかも。。。
definitions要素 +types要素:データ型の定義 +message要素:リクエスタ/プロバイダ間でやり取りされるSOAPメッセージの外枠?だけ定義 →SOAP-RPCの場合、「RPCのリクエスト(doServiceRequest)とレスポンス(doServiceResponse)の2メッセージがあります」という程度 +portType要素:メッセージのつながりを定義する。 +operation要素 →ポートという概念上にメッセージのつながりを定義する。 →SOAP-RPCの場合、「input要素がdoServiceRequest、output要素がdoServiceResponse で、つまり双方向型のポートです」という程度 +binding要素 →ポートで使うプロトコルを定義する。 →SOAP-RPCの場合、「SOAP over HTTP上で、SOAP-RPCを使う」という感じ +service要素 +port要素 →サービス提供するURLを定義する。
バインディング拡張
サービスの物理接続面?(プロトコルなど)は、binding要素で定義する。
bindingの方法には以下がある。
- SOAP over HTTP バインディング拡張
- HTTP GET/POST バインディング拡張
- MIME バインディング拡張
参考
図解標準 最新Webサービス マスタリングハンドブック―XML、SOAP、WSDL、UDDIの基本から開発まで
出版社: 秀和システム ; ISBN: 4798007064 ; (2004/02)
リンク集
JavaでHelloWorld SOAP編
http://www.hellohiro.com/soap.htm
最終更新時間:2005年02月14日 18時12分44秒