Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

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 ページがデフォルトのブラウザに表示されます。

generated description: directorypage

キー値として 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"),"'","''")

FeedbackOpens in a new tab