SAP NetWeaver Gateway の API を ES5 で試してみる:Postman & CData SAP Netweaver Gateway

f:id:sugimomoto:20211215174742p:plain

こんにちは。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」をクリックします。

f:id:sugimomoto:20211215174151p:plain

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

f:id:sugimomoto:20211215174158p:plain

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

f:id:sugimomoto:20211215174203p:plain

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

f:id:sugimomoto:20211215174209p:plain

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

f:id:sugimomoto:20211215174216p:plain

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

f:id:sugimomoto:20211215174238p:plain

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を指定します。

f:id:sugimomoto:20211215174253p:plain

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

f:id:sugimomoto:20211215174312p:plain

テーブルライクにアクセスできる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

以下のように無事取得できました!

f:id:sugimomoto:20211215174321p:plain

ただ、デフォルトはデータが多いので「$top=10」などの取得条件を付与したほうがいいですね。

CData SAP Netweaver Gateway から接続してみる

せっかくなので、CData で提供している「SAP Netweaver Gateway」Driverからも接続してみました。

今回はODBCを利用しますが、特にテクノロジーは問いません。以下のURLからトライアルがダウンロードできます。

www.cdata.com

f:id:sugimomoto:20211215174335p:plain

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

プロパティ名 備考
Auth Scheme Basic
URL 例)https://sapes5.sapdevcenter.com/sap/opu/odata/
IWBEP/GWSAMPLE_BASIC/
APIエンドポイントを指定します。
User 例)P1234567890
Password 例)YOUR_USER_PASSWORD

f:id:sugimomoto:20211215174344p:plain

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

f:id:sugimomoto:20211215174349p:plain

これだけだと物足りないので、Microsoft の BIツール、Power BIからも接続してみます。

powerbi.microsoft.com

Power BI Desktopを立ち上げて「データを取得」からODBCを選択し

f:id:sugimomoto:20211215174355p:plain

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

f:id:sugimomoto:20211215174359p:plain

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

f:id:sugimomoto:20211215174404p:plain

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

f:id:sugimomoto:20211215174410p:plain

おわりに

SAP はなかなか検証環境を手に入れるのが難しいですが、これはいいですね!

トライアル・お問い合わせ

関連コンテンツ