
こんにちは。CData Software Japanリードエンジニアの杉本です。
この記事は Web API Advent Calendar 2021 15日目です。
qiita.com
最近ちまちまとSAPの勉強(主にAPI・RFC周りですが)をしているのですが、Web API Advent Calendar 2021 11日目に @nanaki11 さんが、ES5で SAP Gateway のAPI Demo環境が試せるよ! と書いているのを見て、居ても立ってもいられず、試しました!
qiita.com
今回はその環境構築から、Postman と CData Driver を使ったAPIアクセス方法までをざっくりお届けしたいと思います。
以下の英語記事でも詳しい手順が解説されています。
developers.sap.com
ちなみに、ES5とはなんぞやと調べてみたら、以下の記事で詳しく紹介されていました。
SAP Netweaver Gatewayとは、SAP ERPと他のシステムを接続する際のハブとなるシステムです。SAP ERPからデータを抽出するODataサービスを作るときに必要になります。
SAP ES5は、SAP Netweaver Gatewayのデモシステムであり、ES5で公開されているODataを利用してアプリ開発を試すことができます。
blogs.sap.com
環境構築
とりあえず以下のURLにアクセスして、SAPアカウントでログインしましょう。
https://register.sapdevcenter.com/SUPSignForms
以下のようにUser InformationとTerms and Conditions の確認を行って、「Register」をクリックします。

登録が完了すると、数分後にメールアドレスにログインURLなどが送られてきます。

メールにはSAP NetWeaver のURLと各種ログイン情報が書かれているのでアクセスしてログインしてみましょう!

以下のようにログインできて、UIのロードが行われます。

が、なぜかいきなりエラー画面・・・!

まだ構成中なのかな? と思ったので、一旦間を開けてアクセスしてみたところ、無事以下のようなUI画面が表示できました!

API アクセスを試してみる
環境構築が完了したら、APIアクセスを試してみましょう。
APIアクセスにはPostmanを使いました。
www.postman.com
SAP Gateway APIはODataに準拠しているので、まずは$metadataにアクセスして利用できるリソースを確認してみます。
「/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/$metadata」でアクセスできるようですね。
GET /sap/opu/odata/IWBEP/GWSAMPLE_BASIC/$metadata HTTP/1.1
Host: sapes5.sapdevcenter.com
Authorization: Basic XXXXXX
認証はBasic認証で通るので、「Authorization」タブで「Basic Auth」を選択して、ログインに利用したUsernameとPasswordを指定します。

これで「Send」をクリックすると、以下のようにMetadataが取得できました。

テーブルライクにアクセスできるEntitySetだけ抜き出してみると、以下のようなラインナップがありました。
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"BusinessPartnerSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.BusinessPartner"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"ProductSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.Product"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"SalesOrderSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.SalesOrder"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"SalesOrderLineItemSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.SalesOrderLineItem"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"ContactSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.Contact"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_SexSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_Sex"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_CountrySet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_Country"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_AddressTypeSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_AddressType"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_CategorySet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_Category"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_CurrencySet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_Currency"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_UnitQuantitySet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_UnitQuantity"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_UnitWeightSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_UnitWeight"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_UnitLengthSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_UnitLength"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_ProductTypeCodeSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_ProductTypeCode"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_BPRoleSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_BPRole"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><EntitySet </span><span class="synType">Name</span>=<span class="synConstant">"VH_LanguageSet"</span><span class="synIdentifier"> </span><span class="synType">EntityType</span>=<span class="synConstant">"GWSAMPLE_BASIC.VH_Language"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">creatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">updatable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">deletable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">pageable</span>=<span class="synConstant">"false"</span><span class="synIdentifier"> </span><span class="synType">sap</span><span class="synComment">:</span><span class="synType">content-version</span>=<span class="synConstant">"1"</span><span class="synIdentifier">/></span>
一覧の「SalesOrderSet」を試してみましょう。
「/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderSet」にGETリクエストを送ります。
レスポンスはJSONでほしいので「Accept: application/json」を指定しました。
GET /sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderSet HTTP/1.1
Host: sapes5.sapdevcenter.com
Accept: application/json
Authorization: Basic XXXXX
以下のように無事取得できました!

ただ、デフォルトはデータが多いので「$top=10」などの取得条件を付与したほうがいいですね。
CData SAP Netweaver Gateway から接続してみる
せっかくなので、CData で提供している「SAP Netweaver Gateway」Driverからも接続してみました。
今回はODBCを利用しますが、特にテクノロジーは問いません。以下のURLからトライアルがダウンロードできます。
www.cdata.com

インストール完了後、以下のような接続設定画面が立ち上がるので必要な情報を入力します。

入力後「接続のテスト」をクリックして、以下のメッセージが表示されればOKです。

これだけだと物足りないので、Microsoft の BIツール、Power BIからも接続してみます。
powerbi.microsoft.com
Power BI Desktopを立ち上げて「データを取得」からODBCを選択し

先程接続設定を行った「CData SAPGateway Source」を選択します。

認証方法は先程設定しているので「Windows」タブの「現在の資格情報を使用する」を選択して接続してください。

あとは、ODataのリソースがテーブル一覧として表示されるので、好きなテーブルを選択すればPower BI にデータを読み込むことができます。

おわりに
SAP はなかなか検証環境を手に入れるのが難しいですが、これはいいですね!
関連コンテンツ