AS/400展望台

Webサービスを取り入れることのできるRPG



スコット・クレメント著

私はRPGが大好きです。RPGは、ビジネス・ルールを記述するのに最も適した言語だと思っています。Webサービスとはビジネス・プロセスを統合することに尽きるので、それをRPGプログラムから呼び出す(Webサービスの用語で言えば「取り入れる」)ことが可能であるのはまさに理にかなっています。本稿ではWebサービスについて知っておく必要のあることと、WebサービスをRPGプログラムから取り入れる方法の概要について説明します。本稿ではJavaやWebSphereのサンプル・コードは必要ありません。

・そもそもWebサービスとは何か?
Webサービスは、WWW上でプログラムを呼び出す手段に過ぎません。プログラマーであればどなたでも、同じコンピュータ上にある他のプログラムを呼び出す方法については既にご存知でしょう。たとえば、2つの企業間の為替レートを調べるプログラムがあったとしましょう。それを呼び出すにはたとえば次のようになります。
CALL PGM(GETRATE) PARM('USD' 'JPY' &RATE)

このプログラムは為替レートを求めるための2つの通貨単位?この場合は米ドルと日本円?をパラメータとして受け取っています。この2つのパラメータは入力のためだけにあるもので、プログラムに対してどの通貨単位を調べれば良いかを伝えます。GETRATEプログラムが為替レートを検索した後、このプログラムを呼び出した側に何らかの手段でその結果を返す必要があります。このために3番目のパラメータがあり、これは出力専用になっています。

Webサービスを呼び出す場合にも同様のロジックが必要となりますが、呼び出しをWeb上で行い、パラメータはXMLドキュメントで渡される点が異なります。HTTPサーバーはほとんどすべての主要コンピュータ・プラットフォーム上で利用することができ、そのすべてのコンピュータ・プラットフォームがXMLドキュメントを解釈することができるので、RPGプログラムは別の言語で書かれた世界中のあらゆるコンピュータ上で実行されている他のプログラムを呼び出すことができるのです。

この機能が生み出す可能性を想像してみてください。あなたの会社でもこの機能を利用することができるのです。実運用されているWindowsマシン上に.NETソフトウェアがあると思います。そのソフトウェアをiSeriesの経理システムから呼び出す必要があるとします。このWindowsマシン上のWebサービスをTCP/IPネットワークを介してRPGプログラムから呼び出すことができるのです。さらに驚くことに、国内遠く離れたところにあるUnixマシン用に作られた在庫管理プログラムを呼び出すこともできるのです。これは両方のコンピュータがインターネット上にあるからです。

Webサービスは自分が所属する組織内の他のプログラムを呼び出すためだけのものではありません。たとえば、顧客からの電話注文を受けているオペレータを例に考えてみましょう。オペレータがクレジットカードの番号をキー入力すると、顧客と電話が繋がったままの状態で、RPGプログラムが銀行のコンピュータ上に提供されているWebサービスを呼び出して確認番号をリアルタイムで受け取ることができます。また、顧客が自分の注文した品物がいつ届くのかを問い合わせてくる場合もあるでしょう。この場合は、発注状況管理プログラムがUPS(米国宅配便)のシステム上にあるWebサービスを呼び出して、商品の配達状況を分単位で把握することができます。

このような話は未来の夢物語か私の近未来予測に聞こえるでしょうか。そうではありません。現在のWebサービスで既に利用可能になっているのです。

・SOAPでパラメータを渡す
私が最初にご紹介したWebサービスはWebserviceX.NETが提供している通貨変換サービスCurrency Convertor [sic]です。このWebサービスは入力パラメータとして2つの国名を受け取り、その両国間の為替レートを返します。この通貨変換サービスの詳細についてはwebservicex.net/currencyconvertor.asmxをご覧ください。

通貨変換サービスCurrency Convertorに渡す必要のあるSOAPメッセージを図1に示します。このメッセージの中には処理に必要な入力パラメータが含まれています。この例ではFromCurrencyとToCurrencyの2つの入力パラメータを渡しています。Webサービスはこの2つのパラメータを使用して為替レートを検索し、その結果を返します。

通貨変換サービスWebサービスCurrency Convertorの出力を図2に示します。この出力もSOAPメッセージになっていて、為替レートがConversionRateResult XMLタグ中に含まれています。このメッセージがWebサービスから私のRPGプログラムに返されてきます。

・WSDLで記述されたパラメータ
WebサービスにどのXMLタグを渡せば良いのかということは、どのようにしたら知ることができるのでしょうか。Webサービスからの答えの内容を、どのようにしたら知ることができるのでしょうか。呼び出そうとしているWebサービスについて知りたいことのすべてはWebサービス記述言語(WSDL: Web Services Description Language)ドキュメントと呼ばれる別のXMLファイルに記載されています。上記の為替変換WebサービスのWSDLドキュメントの要約版を図3に示します。

図3に示すWSDLドキュメントは、内容を理解しやすくするために、WebserviceX.NETが提供しているオリジナルの公式ドキュメントに少しだけ手を加えてあります(短くわかりやすくしました)。前述のURLでWebserviceX.NETのWebサイトに行って[Service Description]をクリックすればオリジナルのWSDLドキュメントすべてを見ることができます。

私はWSDLドキュメントを読むときは常にボトムアップ方式で読みます。図3中の呼び出しCはPortTypeと呼ばれるXMLのタグです。Webサービスの用語においてポートは呼び出し可能なオブジェクトなので、プログラムのようなものです。このポート内にはプログラムが実行できる操作が1つ以上あります。各操作にはそれぞれ異なるパラメータがあります。

実際のところ、ILEの考え方をある程度ご存知であれば、ポートとはサービス・プログラムの一種のようなものでそれぞれの操作がそのサービス・プログラムからエキスポートされたサブプロシージャのようなものであると考えるとわかりやすいでしょう。

図3でCを呼び出している部分のコードを見ると、CurrencyConvertorSoapポートにはConversionRateという操作が1つあることがわかります。ConversionRate操作はConversion RateSoapInという入力メッセージとConversion RateSoapOutという出力メッセージを受け取ります。

上記の入力メッセージと出力メッセージが図3でAおよびBを呼び出している部分のコードに表れています。この部分コードから、メッセージにどのような名前が付けられていて、それぞれのメッセージにどのようなタグが含まれているかがわかります。図3に示されている情報と図1および図2のSOAPメッセージとを比較すると、一致しているのがおわかりいただけるでしょう。

図3中のWSDLドキュメントから、図1および図2中のSOAPメッセージを作成するために知っておく必要のあることがすべてわかります。WSDLドキュメントを読めばSOAPメッセージを自分で作成できます。でもそれは退屈な作業なので、通常私はSOAPメッセージを作成するためのツールを使用します。

便利なSOAPメッセージ生成ツールがWeb上のsoapclient.com/soapmsg.htmlで手に入ります。「SOAP Message Generator」というところまで下にスクロールしていって、変換したいWSDLドキュメントのURLと呼び出したい操作(Webサイトでは「メソッド」と呼んでいます)を入力します。するとSOAPメッセージをどのように記述したらよいかを示してくれます。

同様のツールは他にもありますが、私はこのWebサイトのものを利用しています。自分でもこのようなツールをRPGで作りたいと思っているのですが、そのための時間がなかなか取れません。また本稿のような記事を書く機会があったらご紹介しましょう。それまでは上記のWebサイトのものを試してみてください。

・HTTPAPIで呼び出す
さてWebサービスにどのようなSOAPメッセージを送信したらよいか、どのメッセージが返されてくるのかがおわかりいただけたところで、Webサービスを呼び出す方法を覚えていただかなければなりません。標準的なWebページというものがあればブラウザを使ってWebサービスにアクセスしますが、もちろん標準的なWebページではありません。RPGプログラムが必要なときにWebサービスを呼び出すようにしたいですし、処理が終わったら返答させなくてはなりません。したがって次に、HTTPプロトコルで通信できるRPGプログラムが必要になります。

2001年に私はまずHTTPAPIというオープン・ソースのプロジェクトを立ち上げました。このプロジェクトの目的はRPGプログラムにブラウザと同じ役割を持たせようというものでした。HTTPAPIはWebサイトwww.scottklement.com/httpapiから無料でダウンロードできます。

通貨変換WebサービスCurrency Convertorを呼び出すためのプログラムGETRATEのRPGコードを図4に示します。GETRATEはまず通貨変換サービスに送信するSOAPメッセージを生成します(図4のA)。生成し終わると、GETRATEはHTTPAPIを使用してWebサービスを呼び出し、生成したSOAPメッセージをXMLドキュメントに送信します。http_url_post _xml()サブプロシージャの5番目のパラメータを使って、Webサービスが返してくる全てのXML要素に対してIncomingサブプロシージャを呼び出すようにHTTPAPIに指示します。6番目のパラメータでは、Incomingサブプロシージャの最初のパラメータとしてResultという変数を渡すように指示します。

HTTPAPIはWebサービスを呼び出すための全ての作業を処理し、Webサービスに入力ドキュメントを渡し、Webサービスから応答を受信します。HTTPAPIが受信する全てのXML要素に対して、HTTPAPIはIncomingサブプロシージャを呼び出します。図2をもう一度見ていただくと、soap:Envelope、soap:Body、ConversionRateResponse、ConversionRate Resultの各XML要素に対して、HTTPAPIがIncomingサブプロシージャを4回呼び出しているのがおわかりいただけるでしょう。

Incomingサブプロシージャでは、どのXML要素が処理されているのかをチェックします。処理されているXML要素がConversionRateResultの場合は、為替レートをResult変数に保存します(図4のC)。

GETRATEプログラムはiSeriesNetwork.com/codeからダウンロードできます。GETRATEのコンパイル方法はプログラムのソースコードの最上部にコメントとして記載されています。コンパイル後は次のように実行して為替レートを計算します。
CALL PGM(GETRATE) PARM('USD' 'JPY' &RATE)

・文章の翻訳
WebserviceX.NETで見つけた別の興味深いWebサービスは、文章をある言語から別の言語に翻訳するサービスです。このWebサービスはXMLドキュメントが少し違う点を除けば、前述のGETRATEプログラムと全く同じように動作します。翻訳エンジンWebサービス
Translation Engineについての詳細についてはwebservicex.net/translateservice.asmxを参照してください。

 

TRANSLATEという名前をつけたプログラムのコードの一部を抜粋したものを図5に示します。このプログラムは英語の文章をスペイン語に翻訳します。このプログラムのコードの大部分はGETRATEプログラムのコードと同様に動作しますので、本稿にコードすべてを掲載することはしませんが、全コードをiSeriesNetwork.com/codeからダウンロードすることができます。

Webサービスに送信されるSOAPドキュメントには翻訳元言語と翻訳先言語がLanguageModeというXML要素に含まれており、翻訳対象の文章はTextと呼ばれるXML要素に含まれています(図5のA)。

スペイン語に翻訳された翻訳結果はTranslateResultというXML要素の中にあります。Incomingサブプロシージャがこの要素を探し出して見つけると、翻訳結果をStringという変数中に保存します(図5のB)。

貨物の配送状況の確認 UPSにはUPS Online Toolと呼ばれるツール群があり、UPSの顧客はこのツールを使用して料金を検索したり、送付先の住所を確認したり、配送状況を確認したり、受け取りのサインを表示させたりすることができます。このツールを使用するには、UPSにユーザー登録しなければなりません。ユーザー登録はups.com/content/us/en/bussol/offering/technology/automated_shipping/online_tools.htmlのページですばやく簡単に行えます。

ここでは例として、UPSの貨物追跡ツールで貨物の配送状況を確認する方法を紹介します。この例を試す場合には、貨物追跡ツールに登録してUPSからユーザーID、パスワードと、ライセンス・コードが既に送り返されてきている必要があります。これらの情報を使って追跡プログラムを試用してみます。これら3つの情報のフィールドのソース・メンバーの最上部に名前つき定数を置きました。このプログラムを試用するには、これらのフィールドに値を入力しておかなければなりません。

UPSは貨物追跡サービスを記述するのに標準のSOAPドキュメントやWSDLドキュメントを使用しません。その代わりに、このUPSサービスを使用するために送受信する必要のあるXMLメッセージについて説明したPDFドキュメントを提供しています。このPDFドキュメントには、このツールを使用するためのXML要素について詳細に記載されています。

UPSはSOAPやWSDLを使用しませんが、処理そのものは前述の例と同様です。配送状況を確認したい貨物の追跡番号を含んだXMLドキュメントを作成し、HTTPAPIを使用してこのドキュメントをUPSに送信します。UPSは貨物の配送状況を含んだXMLドキュメントを送り返してきます。

送受信が安全で確実に行われるように、UPSは送受信に使用するデータをSSLで暗号化して保護しています。したがってこの例を使用するには、システム上でSSLサポートが利用可能であることを確認しておく必要があります。HTTPAPIに含まれているQRP GLESRCファイルのREADMEメンバーには、SSLサポートを設定するための説明があります。

このWebサービスを紹介するためのプログラムUPSTRACKを書いてみました。このプログラムはiSeriesNetwork.com/codeからダウンロード可能です。図6はユーザーが追跡番号を入力する画面で、この番号を使ってUPSに送信されるXMLドキュメントが作成されます。UPSは出力ドキュメントを返信してきます。このドキュメントもXMLフォーマットです。UPSTRACKプログラムは返信されてきたドキュメント内の必要なフィールドの値を取り出し、サブ・ファイルに埋め込みます。Webサービスからの出力を含んでいるサブ・ファイルを図7に示します。

当然のことながら、こうしたツールは緑色画面のアプリケーションで使用する必要はなく、WebアプリケーションやGUIアプリケーションからも利用することもできます。同様に、必要に応じてたとえば夜間バッチ処理中にデータベース内の貨物の配送状況をチェックするといったバッチ・アプリケーション中で使用することもできます。

・さらにもっと
ここでご紹介した例は、Webサービスを使用してできることのごく一部です。利用可能なサービスの一覧は以下のサイト(ごく一部ですが)で見つけることができます。
  ・ xmethods.net
  ・ webservicex.net
  ・ bindingpoint.com

他のHTTPAPIユーザーに支援を求めたり、ヒントを共有したりするためのメーリング・リストもあります。HTTPAPIのダウンロードやメーリング・リストへの登録はwww.scottklement.com/httpapiで行えます。

ここでご紹介したRPGプログラムからWebサービスを取り入れる方法をお読みになって、読者の方がご自身でWebサービスを使ってみようという気になっていただければと思っています。この便利な機能の使用法をたくさん発見できることと思います。

スコット・クレメント氏はベル・データ鰍フ業務提携先米Penton Media,Inc.が発行するiSeries NEWS誌のテクニカル編集者、電子メール・ニュースレターClub Tech iSeries Programming Tipsの編集者であり、iSeries Networkのフォーラムの専門家でもあります。またKlement Sausage社の情報システム部門のマネージャーでもあります。



↑このページのトップへ
TOPPAGE

BELLDATA, Inc. Copyright reserved.