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リクエストを送信する機能のことです。

