ENSDEMO 内の REST サンプルのウォークスルー
Demo.REST.DirectoryService は、SAMPLES ネームスペースで提供されている Caché データベースへのアクセスを可能にする REST サービスを実装します。
CSP ポートを使用して REST サービスを呼び出すには、まずそのサービスのクラスを処理する Web アプリケーションを定義する必要があります。例えば、ENSDEMO 内の Demo.REST.MathService または Demo.REST.DirectoryService を呼び出すには、ENSDEMO ネームスペース内で /RestServices という名前の Web アプリケーションを定義できます。ENSDEMO データベースと SAMPLES データベースへのアクセスを許可する必要があります。Ensemble の構成と Web アプリケーションの定義のウォークスルーは、“REST サービス向けの Ensemble の構成” を参照してください。
Demo.Rest.Production を実行している場合は、以下の REST 呼び出しを Web ブラウザで入力できます。これにより、名前が "j" で始まる人たちをデータベース内で検索するクエリを発行する HTTP GET 要求が送信されます。
http://localhost:57772/RestServices/Demo.REST.DirectoryService/directory/person/name/j*
ブラウザはこの URL を HTTP GET コマンドとして送信します。URLMap は、次のパラメータと共にこの要求を retrievePerson メソッドに送信します。
retrievePerson("person","name","j*")
このメソッドは SAMPLES データベースに対して情報を要求する SQL クエリ文を作成して、このクエリを実行します。次に ObjectToJSONStream() メソッドを呼び出して、以下の JSON を REST の呼び出し元に返します。
[{
"Age":38,
"Company":"InterTron Holdings Inc.",
"DOB":"1975-06-05",
"FavoriteColors":,
"Home": {
"City":"Islip",
"State":"WY",
"Street":"1199 Maple Place",
"Zip":38998
},
"ID":179,
"Name":"Jung,Jules G.",
"Office": {
"City":"Youngstown",
"State":"OH",
"Street":"803 Madison Place",
"Zip":70937
},
"SSN":"584-94-9346",
"Spouse":"Underman,Diane Z."
},{
"Age":24,
"Company":"MacroNet Associates",
"DOB":"1989-06-05",
"FavoriteColors":["Black","Purple"
],
"Home": {
"City":"Jackson",
"State":"VT",
"Street":"9371 Elm Drive",
"Zip":93057
},
"ID":186,
"Name":"Jung,Sam B.",
"Office": {
"City":"Gansevoort",
"State":"SD",
"Street":"6284 First Place",
"Zip":84332
},
"SSN":"173-48-2772",
"Spouse":"Fripp,Hannah D."
}]
HTTP GET コマンドは、ブラウザに URL を入力するだけで作成できますが、HTTP POST、PUT、または DELETE を生成するのは簡単ではありません。これらの HTTP コマンドを生成するために CURL などのユーティリティを使用するか、ENSDEMO REST サンプルで提供されている DirectoryPage および DirectoryOperation を使用することができます。DirectoryOperation は Ensemble DirectoryService から REST サービスを呼び出すため、外部 REST サービスの呼び出し方法を示す例としては理想的ではありませんが、DirectoryService の REST サービスを呼び出す実例を示すには大変便利なツールです。
DirectoryPage と Directory Operation を使用するには、スタジオ内で ENSDEMO ネームスペースを選択し、Demo.REST.DirectoryPageOpens in a new tab クラスを開きます。[表示]、[ウェブページ] の順に選択すると、次の Web ページがデフォルトのブラウザに表示されます。
キー値として j* を入力し、[取得] をクリックすると、Web ページと DirectoryOperation は、ブラウザで入力されたものと同じ HTTP GET コマンドを送信します。Web ページに、DirectoryService へ送信された URL と、返された JSON が表示されます。このページには、返されたデータの 2 列を含むテーブルが表示されます。いずれかの行をクリックすると、その人のすべてのプロパティと値がページに表示されます。いくつかの値を変更して、[更新] をクリックします。HTTP POST コマンドが生成されます。[削除] をクリックすると、HTTP DELETE コマンドによって指定された ID 値のレコードが削除されます。最後に、SSN フィールドを一意の値で更新し、[作成] をクリックすると、HTTP PUT コマンドによって新しいレコードが作成されます。
DirectoryPage Web ページには、DirectoryService によって返された JSON 値が表示されますが、そのサービスに送信された JSON 値は表示されません。この値を表示する方法の 1 つは、TCP トレース・ユーティリティを使用することです。単純に DirectoryOperation 構成ページで、9989 などの他のポートを指定するように変更します。次に TCP トレース・ユーティリティを使用して、ポート 9989 から 9988 にメッセージを転送します。
このページを使用してデータを更新すると、Caché SAMPLES データベースのデータを変更することになります。
URLMap を使用せずに、下位レベルの OnProcessInput() メソッドを実装することもできます。以下では、このメソッド内で呼び出しを処理する方法を示しています。
Class Demo.REST.DirectoryService Extends EnsLib.REST.Service
{
Parameter ADAPTER = "EnsLib.HTTP.InboundAdapter";
/// The EnsServicePrefix parameter identifies the URL prefix that this component handles
Parameter EnsServicePrefix = "/directory";
Method OnProcessInput(
pInput As %Library.AbstractStream, /// Contains the HTTP command
Output pOutput As %Stream.Object) As %Status /// Output to return to REST call
{
/// Get the HTTP operation: GET, POST, PUT, or DELETE
Set tCmd=$ZConvert(pInput.Attributes("HttpRequest"),"U")
/// Get the URL
Set tURL=$ZConvert(pInput.Attributes("URL"),"I","URL")
/// Get the 2nd part of the URL which contains the service,
/// Test that it matches EnsServicePrefix, "/directory"
Set tService="/"_$ZConvert($Piece(tURL,"/",2),"L") Quit:..#EnsServicePrefix'=tService
/// Get the 3rd part of the URL either person or employee
Set tType=$ZConvert($Piece(tURL,"/",3),"L")
/// Get the 4th part of the URL in this case name
Set tKeyIn=$Piece(tURL,"/",4), tKey=$ZConvert(tKeyIn,"L")
/// Get the 5th part of the URL, the value to query for
Set tKeyVal=$Replace($ZConvert($Piece(tURL,"/",5),"I","URL"),"'","''")