GeneXusのAPIオブジェクトについて

少し前にGeneXusでプロシージャを作って、それをAPIとして呼んでみました。

GeneXusでAPIを作成

イメージとしては下記のような感じです。

このプロシージャで作成したAPIは、HTTPメソッドを必ずPOSTで呼ぶことになります。
Getで呼ぶ場合はデータプロバイダーを作成する必要がありました。

またAPIが返却するステータスコードは自由に設定することもできませんでした。

しかしGeneXus17以降APIオブジェクトが登場し、APIオブジェクトを経由してプロシージャを呼ぶことができるようになりました。

またこちらもイメージとして表すと、下記のような感じです。

APIオブジェクトを経由することで、HTTPメソッドを自由に決められて、またステータスコードも好きなステータスコードを返すことが可能になったので、今回はそちらを記事にしようと思います。

APIオブジェクト作成

まずはAPIオブジェクトを作成します。

前回作成したプロシージャが商品データを取得するものだったので、今回は「ShohinAPI」としました。

まず前回のおさらいなのですが、プロシージャは「GetShohinP」と言う名前で、商品IDを受け取って、商品テーブルを見て対象の商品データを返しました。
パラメータで商品IDが空の場合は、全件返すようにしてます。

Rules

Source

今回はこちらのプロシージャをAPIオブジェクトから呼ぶようにします。
書き方は下記のような感じです。

まず1行目の「Shohin」と書いてある部分は何でも良いです。
2行目はHTTPメソッドを指定できます。
こちらは省略すると自動的にGetになります。

3行目に「GetShohin」と書いてありますが、こちらも1行目と同様何でも良いです。
そして4行目にプロシージャを記載してください。
「=>」を書かないといけないみたいです。
なんか新しい書き方ですね。

これでAPIオブジェクトからプロシージャをGetで呼べるようになりました。

YAMLファイルの確認

APIオブジェクトを作ってビルドすると、YAMLファイルと言うものができます。
今回出力されたYAMLファイルとは、簡単に言うとAPIの設計書みたいなものを既定のフォーマットで書き出したものだと思ってください。

JAVA環境だとwebフォルダ配下とTomcatのStaticフォルダの中にできます。

Static配下にあるのでブラウザでも開けるけど、エディタで開くと下記のような感じ。

APIのURLとかメソッド名とかパラメータとか書いてありますね。
ちなみにこれをPostmanにインポートすると簡単に呼ぶことができます。

APIオブジェクトの呼出し

今回も前回同様Postmanから呼んでみましょう。

まずYAMLファイルをインポートします。
下記の「インポート」を押下して出てきた画面にYAMLファイルをドラッグ&ドロップします。
※インポートはPostmanのアカウントを作ってサインインしてないとできません。

そうすると下記のようなものが一発で出来上がります。

ちなみに{{baseUrl}}の部分は下記のようになってます。

あとはパラメータの値を変えて実行!

無事にプロシージャがGetで呼べて、値も正常に返ってきましたね。

次はステータスコードを返してみましょう。

ステータスコードの実装

今回はパラメータで商品IDを受け取ってますが、空だったらエラーコード「412」を返そうと思います。
また商品IDが空ではないが、商品テーブルに存在しないIDの場合はエラーコード「404」を返すようにします。

まず受け取った商品IDが空の場合のエラーコード実装は下記のとおりです。

記載するところはAPIオブジェクトのEventsタブです。

「Event メソッド名.Before」でプロシージャを呼ぶ前の処理を書くことができます。

次にプロシージャを呼んで戻ってきた値によってエラーを記述したい場合は下記のように記載します。

今度は「Event メソッド名.After」で記載します。

実装は以上です。

ステータスコードの検証

まずパラメータの商品IDを空でAPIを呼び出します。

想定通りステータスコード「412」が返ってきてますね。

次に商品テーブルに存在しないIDを渡してAPIを呼び出してみます。

こちらも想定通りステータスコード「404」で返ってきてメッセージも取れてます。

疑問

PostmanからAPIに渡した商品IDがあった場合は、Shohin_SDTのJson型が返ってきて、なかった場合はMessagesのJson型が返ってきてますね。

商品IDがあってもなくても、APIオブジェクトでoutしているSDTは2つなんだから、どんな場合でも2つ返ってくるのでは?

そんな質問をいただいたので検証してみると、どうやらSDTに何も入っていない場合はSDTのJson型が返ってこないみたいです。

試しに正常に商品が取れた場合、Shohin_SDTとMessagesを両方返すようにしてみました。

これで動かしてみると、下記のように2つのSDTがJson化されて返ってきました。

中身が空の場合は返ってこないというのが仕様みたいですね。

空の場合でも返したい場合は、戻りをLongVacharとかにして自分でSDTをJson化して戻してあげる必要があります。

まとめ

以上がGeneXusのAPIオブジェクトの説明になります。

今までAPIオブジェクトと言うものがあるのは知っていたのですが、プロシージャをAPI化すれば呼べたし、特に調べもしないで不要なものだと認識してました。

ただ今回APIオブジェクトについて質問いただいたので、ちょっと調べてみたら思った以上に色々できて、これは使えるなと思いました。

特にプロシージャを呼ぶ前にパラメータの確認や、実行結果によってステータスコードが変更できるのは良いですね。

今まではデータがなくてもAPIが正常に動けば「200」が返ってきていたのですが、「404」で返せるのはありがたいですね。

またAPIオブジェクトからYAMLファイルが作成されるので、SwaggerとかBlueprintに連携してAPI仕様書とか簡単に作れそうですね。

ちなみに今回はAPIオブジェクトに1つのプロシージャしか書きませんでしたけど、複数書くこともできます。

例えば商品を全件取得するAPIと、指定したデータのみ取得するAPIを2つに分けたい場合は、下記のように書けばプロシージャ1本で実現することが可能です。

メソッド名を変えて、プロシージャは同一でパラメータを変更します。

GetShohinPは商品IDが空の場合は全件取得して返すので、これで実現できます。

もしAPIを実装する機会がありましたら、ぜひAPIオブジェクトを作ってみてください。

Blog一覧へ