.NETでは、データがネットワークを流れて、さまざまなクライアントやサーバに渡ることを想定している。ここでいうネットワークは、社内LANだけでなくインターネットも含む。インターネットでは、セキュリティ上、ファイアウォールが構成されていることが多く、どことでも接続するためには、データのやり取りに、ファイアウォールを通しやすいプロトコルを採用する必要がある。また、クライアントやサーバは、WindowsではないOSである可能性もある。そのため、汎用性も求められる。
そこで.NETでは、「データをやり取りするプログラム」として、「XML Webサービス」と呼ぶ規格を採用している。XML Webサービスは、次の特徴を持つ。
1. HTTPでの通信
データは、HTTP(Hpyer Text Transfer Protocol)で通信する。HTTPは、Webで使われているのと同じプロトコル。現在、インターネットを使っていて、「Webを見られない」という環境はほとんどないはずだ。つまり、ほとんどの環境ではファイアウォールでHTTPを透過する設定がされており、HTTPを採用しているXML Webサービスは、ファイアウォールを通しやすいといえる。
また、プロトコルにHTTPを採用することで、Webアプリケーションの構成に使われているさまざまな技術を流用できるというメリットもある。
例えば、ユーザー認証やSSL(Secure Socket Layer)による暗号化、そして、アクセスログの記録や集計などに、Webアプリケーションと同じ仕組みを利用できる。実際のところ、XML Webサービスは、図2に示すように、Webサーバ上で実行され、XML形式のデータを返す、一種のWebアプリケーションである。
2. SOAPによるデータの表現
Windows以外のOSとの連携を考えた場合には、やり取りするデータをどのように表現するかが問題となる。そこで、XML Webサービスでは、「SOAP」(Simple Object Access Protocol)と呼ばれる仕様に則ったデータ形式で行う。
SOAPとは、簡単にいえば「Webを利用して、リモートのプログラムを呼び出す仕組み」のことである。リモートのプログラムを呼び出す際に引き渡す値や、プログラムから戻ってくる値は、XMLでタグ付けされる(リスト1、リスト2)。
もちろん、リモートのプログラムを呼び出す時には、そのリモートのプログラムが、どのような値を受け取り、どのような値を返すのかという情報が必要だ。その情報もXML形式で書かれており、「WSDL(Web Services Description Language)」と呼ばれる(リスト3)。SOAPの仕様は、W3Cによって標準化されており、OS依存しない。そのため、SOAPで表現されているXML Webサービスは、どのようなOSからでも呼び出せる。
リスト2に示したように、XML Webサービスから戻ってきた値は、XMLでタグ付けされた構成なので、データを受け取ったアプリケーションは、データ加工しやすいのもメリットのひとつだ。例えば、XMLでは、XML形式のデータを他の形式のデータに変換するために、「XSLT」と呼ぶ仕様がある。XSLTを使うと、XML形式のデータをHTML形式など、他の形式に容易に変換できる。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ValueAdd xmlns="http://tempuri.org/">
<a>10 </a> <!-- 引き渡す値-->
<b>20</b> <!-- 引き渡す値-->
</ValueAdd>
</soap:Body>
</soap:Envelope>
<?xml version="1.0" encoding="utf-8" ?> <int xmlns="http://tempuri.org/">30</int> <!-- 実行結果(10 + 20 = 30) -->
<?xml version="1.0" encoding="utf-8" ?>
<definitions
…中略…
>
<types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://tempuri.org/">
<s:element name="ValueAdd">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="a" type="s:int"
/> <!-- 整数aをとるという意味 -->
<s:element minOccurs="1" maxOccurs="1"
name="b" type="s:int"
/> <!-- 整数bをとるという意味 -->
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ValueAddResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="ValueAddResult" type="s:int"
/> <!-- 結果に整数を返すという意味 -->
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</types>
…中略…
</definitions>
Copyright © ITmedia, Inc. All Rights Reserved.