
はじめに
ODataサービスとしてのデータ公開が難しい、または外部REST APIのデータをFioriアプリで取得・利用したい…といったケースはないでしょうか。私は普段BTPでのフロントエンド開発を担当しており、外部サービスとの連携は Approuter と Destination で行っていますが、同じようなことをオンプレミスでできないかを検証する機会がありました。要件としては、S/4 HANA のSM59トランザクションを使って外部APIに接続し、取得したデータを最終的にFioriアプリに表示したいといったものです。本記事では、この課題を解決するため、ABAPでHTTPリクエストハンドラを構築し、Fioriアプリケーションから呼び出す手順を解説します。
ODataとしてデータを扱うのが難しい場合の代替案としてFiori開発者およびABAP開発者、または初めてABAPを触る方などの参考になれば幸いです。

ABAPとは
ABAP (Advanced Business Application Programming)は、SAPアプリケーション専用のプログラミング言語です。SAPのERPソフトウェアのカスタマイズや、機能拡張を行うために使用されています。
基本的な文法については、以下の特徴が挙げられます。
- 文頭は「ABAPキーワード」で始まる
- 文末は「.(ピリオド)」で終わる
- 大文字小文字の区別はされない
- コメントアウトは全文の場合は「*」、部分的なコメントアウトは「”」を使う
ABAPクラスの作成(SAP GUI側の操作)
ではさっそく、SAP GUIでトランザクション「SE24」を開き、オブジェクトタイプを登録してクラスを作成します。

作成が完了したら、フォームベースもしくはソースコードベースで内容の更新が可能です。今回はソースコードベースでHTTPリクエストを作成します。
ソースコードベースを選択するとコードエディタが表示されるので、以下のサンプルコードをコードエディタに記述してください。
class /TEST definition
public
final
create public .
public section.
INTERFACES if_http_extension.
ENDCLASS.
CLASS /TEST IMPLEMENTATION.
METHOD if_http_extension~handle_request.
DATA: lv_json TYPE string,
lv_method TYPE string,
lv_id TYPE string,
lv_body TYPE string.
" HTTPメソッドを取得
lv_method = server->request->get_method( ).
CASE lv_method.
WHEN 'GET'.
lv_json = '{"customer":"1001","name":"山田太郎"}'.
server->response->set_status( code = 200 reason = 'OK' ).
server->response->set_header_field( name = 'Content-Type' value = 'application/json' ).
server->response->set_cdata( lv_json ).
WHEN 'PUT'.
…(必要な処理)
ENDCASE.
ENDMETHOD.
ENDCLASS.上記のサンプルコードでは、HTTPリクエストハンドラの作成にあたってIF_HTTP_EXTENSIONインターフェースを使用しています。
またメソッドではIF_HTTP_EXTENSIONのif_http_extension~handle_requestを使い、HTTPメソッド(GET、POST、PUT、DELETEなど)に応じた処理とレスポンスロジックを「CASE」を使って記述しています。
参考:https://help.sap.com/docs/SAP_NETWEAVER_701/6da114706c4b1014bfedc1de475963c2/48d402901904154ee10000000a421937.html?locale=en-US
SICFサービスの追加とABAPクラスの紐づけ(SAP GUI側の操作)
続いて作成したABAPクラスを外部から呼び出せるように、トランザクション「SICF」でサービスを公開します。

サービスを作成したい階層で右クリックをして、「新規サブ Element」を押下します。その後サービスエレメントの登録をして、ハンドラ一覧に作成したクラス名を追加します。保存ボタンを押すとSICFサービスが追加されます。作成したサービスを右クリックし、サービス有効化を押下すると、そのサービスが利用可能になります。
試しにURLを叩いて、データが表示されていることを確認してください!
Fioriアプリからの呼び出し(SAP Fiori側の実装)
最後にFioriアプリからABAPで作成したHTTPクライアントを呼び出します。
パスは先程有効にしたSICFサービスのものを指定し、fetchや$.ajax等で呼び出しを試します。
fetch('/sap/bc/TEST')
.then(response => {
if (!response.ok) {
throw new Error(“応答失敗: ” + response.status);
}
return response.json();
})
.then(data => {
console.log(“取得成功: ”, data);
})
.catch(error => {
console.error(“エラー: ”, error);
});デプロイ後確認すると、無事データが取得できることを確認できました。
おわりに
本記事ではABAPでHTTPリスエストを作成し、Fioriアプリから呼び出す方法を紹介いたしました。
外部システムとの接続にSM59トランザクションを使うため、一度ABAPを挟む形でFioriアプリとデータを受け渡しができるかどうかの調査が必要でしたが、今回の検証で無事可能であることを確認することができました。
また、私は今までABAPを触ったことが無かったので、一から書き方等を調べながらの調査でした。今回は簡単な実装でしたが、クラスの作成方法など様々なことが学べて良かったです!
今後も技術検証の内容で、皆様に共有したいものを発信していきますので、どうぞよろしくお願いいたします!
投稿者プロフィール

-
2022年新卒入社。Vue.js と Spring boot を用いた社内用経歴管理の開発に1年間携わり、現在は SAP Fiori を用いた開発案件を担当しております。「理解しやすいコード・使いやすいUI・伝わりやすい資料」を作れる人になるために日々勉強中です。
趣味は絵を描くことです。



