REST APIの作成(1)
この連載の最後に、IRISが保持する車の最新情報を取得するためのREST APIを作成します。
IRISでREST APIを作成する方法にはいくつかありますが、今回は、OpenAPI 2.0を利用する方法を紹介します。実際に試す方は、REST APIを呼び出せるツールを用意してください。この連載では、Postmanを使用します。
REST APIの生成と実装
OpenAPIは、REST APIのインターフェースを記述するための仕様で、OpenAPI Initiativeにより管理されています。IRISは、OpenAPI 2.0に準拠した仕様をもとに、REST APIを作成することができます。
次に示すのは、OpenAPIで記述されたインターフェース定義の一部です。DriveDemo/IRIS-MQTT/projects/RestAPI/spec.jsonというJSONファイルがあるので確認してください。
{ "swagger":"2.0", "info":{ "version":"1.0.0", "title":"Drive Demo", "description":"Drive Demo: REST APIの定義", "termsOfService":"http://swagger.io/terms/", "contact":{ "name":"InterSystems Japan" }, "license":{ "name":"MIT" } }, "basePath":"/csp/DriveDemo", "schemes":[ "http" ], "consumes":[ "application/json" ], "produces":[ "application/json" ], "paths":{ "/cars":{ "get":{ "description":"すべての車の情報を返す", "operationId":"getAllCars", "produces":[ "application/json" ], "responses":{ "200":{ "description":"車のリスト", "schema":{ "type":"array", "items":{ "$ref":"#/definitions/Car" } } } } } } }, "definitions":{ "Car":{ "type":"object", "required":[ "carid", "relativetm", "longitude", "latitude", "azimuth", "speed", "enginerpm", "accelpos", "brakesw" ], "properties":{ "carid":{ "type":"string" }, …後略… }
いくつか重要な項目を説明します。
- “basePath” : APIのルートとなるURLのパス名です。IRISでは、後に説明するようにWebアプリケーション名としてこのパス名を使用します。
- “paths” : インターフェースに含まれるAPIそれぞれの相対パスです。ここでは、/carsというAPIがGETメソッドを受け取るよう定義されています。また、”operationId”には、IRISが生成するメソッドの名前を指定します。
ではPostmanでREST APIの生成を行います。Postmanを立ち上げます。次の図のように、リクエストの画面に設定を行います。
- メソッドにはPOSTを選択します。
- URLはhttp://localhost:52003/api/mgmnt/v2/drive/DriveDemoを指定します。ここで/api/mgmnt/v2がIRISのAPI作成機能のURLで、/driveはネームスペース、/DriveDemoはアプリケーション名を示します。
- Bodyを選択し、上で示したJSONファイルの内容を貼り付けます。また、”raw”と”JSON”を選択します。
- 上の図のように、Authorizationタブを開き、TYPEには”Basic Auth”、ユーザ名・パスワードには、SuperUser/driveuserと指定します。
- 上の図のとおり、Headersタブを開き、”Content-Type”に” application/json; charset=utf-8”を指定します。
次に”Send”ボタンを押します。そうすると、IRISにリクエストが送信され、REST APIの生成に成功すれば、次の図のような応答が得られます。
それではVisual Studio Codeに戻って、生成されたクラスを確認してみましょう。生成されたのは、DriveDemo.implとDriveDemo.specです。次の図のように、Visual Studio Codeの左側メニューからInterSystems のロゴをクリックし、”projects”→”Classes”から2つのクラスにアクセスすることができます。
Postmanから生成したREST APIの実装を行うには、DriveDemo.implクラスを編集します。
DriveDemo.implクラスを開くと、IRISが生成したテンプレートが書かれており、getAllCarsメソッドの定義があります。getAllCarsメソッドの中身に次のようなコードを記述しコンパイルします。
ClassMethod getAllCars() As %DynamicObject { // SQLで車の最新情報を取得し、DynamicObjectを生成する Set tArr = [] Set tRS = ##class(%SQL.Statement).%ExecDirect(,"SELECT CarId, RelativeTm, Longitude, Latitude, Azimuth, Speed, EngineRPM, AccelPos, BrakeSW, aX, aY, aZ FROM DriveDemo_Data.CarLatest order by CarId") While tRS.%Next() { Do tArr.%Push({ "carid": (tRS.%Get("CarId")), "relativetm": (tRS.%Get("RelativeTm")), "longitude": (tRS.%Get("Longitude")), "latitude": (tRS.%Get("Latitude")), "azimuth": (tRS.%Get("Azimuth")), "speed": (tRS.%Get("Speed")), "enginerpm": (tRS.%Get("EngineRPM")), "accelpos": (tRS.%Get("AccelPos")), "brakesw": (tRS.%Get("BrakeSW")), "aX": (tRS.%Get("aX")), "aY": (tRS.%Get("aY")), "aZ": (tRS.%Get("aZ")) }) } Do ..%SetStatusCode(200) Quit tArr.%ToJSON() }
このメソッドでは、SELECT文でDriveDemo_Data.CarLatestを検索し、得られた結果をJSON形式に変換して返しています。
もう1か所編集を行います。DriveDemo.specクラスを開き、
Parameter HandleCorsRequest = 1;
のようにHandleCorsRequestパラメータに1をセットします。これは、CORS(Cross-Origin Resource Sharing)をオンにするものです。CORSとは、簡単にいうと、Webページをサービスしているサーバと異なるサーバに対してRESTリクエストを送信する機能のことです。