【SAP Cloud Integration】ODataサービスを呼ぶ

## はじめに
この記事では、[SAP Cloud Integration](https://help.sap.com/viewer/368c481cd6954bdfa5d0435479fd4eaf/Cloud/en-US/2fb0aa4dc5194b589adcd1c5534901e3.html)を利用してODataサービスを呼ぶ、というシンプルなシナリオを実装してみます。単に「つなげるだけ」に主眼を置いており、取得したデータを利用することはしていません。シンプルに見えてつまづいた点もあったので記録に残しておきます。

初期設定は以下のチュートリアルを参考に実施します。
[Set Up Integration Suite Trial](https://developers.sap.com/tutorials/cp-starter-isuite-onboard-subscribe.html)

## 呼び出すサービス
2つのODataサービスを呼んでみます。いずれも、API Business Hubのサンドボックス環境を使用します。

- [SAP GraphのSales Order](https://api.sap.com/api/sap_graph_SalesOrder/overview) （OData V4）
- [S/4HANA CloudのSales Order (A2X)](https://api.sap.com/api/API_SALES_ORDER_SRV/overview)　（OData V2）

## 事前準備
### EDMXファイルのダウンロード
API Business Hubから各ODataサービスのEDMXファイルをダウンロードしておきす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8f269a1f-8076-5e3f-a66b-00d8d8cffee7.png)

### API Keyの取得
"Show API Key"をクリックしてAPI Keyを表示させ、コピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/fd8f3e18-b900-6673-87b4-064a6b392cf4.png)


## Integration Flowの作成
以下のようなフローを作成しました。各ステップの設定は以降で説明します。（Graph APIを呼ぶためにHTTPとOData V4と2つの方法を試しています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5a5afad8-d71d-b5f9-6f20-64001bb067fc.png)

### Start Timer
タイマーで起動する設定です。このフローはデプロイ時に一度だけ動きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d224b8ee-e875-05dc-0737-9557e66f505e.png)

### Set API Key
このステップはContent Modifierです。Content Modifierでは後続処理に渡すためのヘッダやボディの項目を編集できます。ここでは**apiKey**というヘッダ項目を定義しました。Valueには、事前準備で取得したAPI Keyを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5cfcaac8-c56d-bdba-f1a6-c2201a7a063d.png)

### Get Graph HTTP
最初はあえてODataアダプターを使わずに、HTTPアダプターでGraphのODataサービスを呼んでみます。
ポイントは、Request HeadersにContent Modifierで設定した**apiKey**を指定するところです。ここではヘッダ項目が1つだけですが、複数指定する場合は`|`で区切って指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3e775c61-42cf-39e8-66b8-5e22ddc9a92a.png)

### Get SO V2
次に、S/4HANA CloudのSales OrderをOData V2のアダプターで呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/052cc523-79f1-68fa-312e-4ddb13218bfd.png)
ProcessingタブでResource Pathを選ぶときは、"Select"ボタンを押してダウンロードしておいたEDMXファイルを取り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8956f71d-a28b-d1aa-5246-ae53abd2ab28.png)
ステップ1でLocal EDMX Fileを選択し、ダウンロードしておいたファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1e67c222-5902-f829-b147-4430b8ad4320.png)
ステップ2でエンティティを選択し、取得する項目やTop, Skipといったクエリパラメータを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/047ad3c7-2fef-9792-9426-545484caa707.png)

Processingタブの下の方では、Request Headersに**apiKey**を設定します。HEADER DETAILSとMETADATA DETAILSの両方に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/12b83795-6473-2504-e861-bae05ad84219.png)

### Get Graph OData V4
最後に、GraphのSales OrderをOData V4のアダプターで呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c7cbfd9c-f5cd-d67d-fe29-8447f8211138.png)
Proccessingタブでは、OData V2と同様に、ダウンロードしておいたEDMXファイルを取り込んでクエリパラメータの設定をします。Request Headersに**apiKey**を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9fbf8d93-b29e-0f00-fa8a-7b285363f92a.png)

以上でフローの設定は完了です。

## 接続のテスト
フローを動かす前に、各バックエンドへの接続がうまくいくかテストしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/163ebe98-ded9-8dab-f8ca-e9f2c6b4d20a.png)
"TLS"のタブでテストします。証明書の有効性が確認でき、安全に接続できるかどうかがテストされます。
Hostに接続先のホスト名（https://を含まない）を入力し、"Send"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2a27214c-6833-b92a-02fd-3e5038b3bf4c.png)

## Integration Flowのテスト
作成したフローをデプロイします。タイマー起動なので、デプロイが完了するとすぐに動きます。Monitor Message Processingのタイルを見ると、エラーになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c50b5db7-9cc4-0f7b-eb45-98be61e21e6e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9a5ba546-9a98-c80d-e0f3-539542c26038.png)
エラーのログを見ると、最後のOData V4の接続でエラーになっています。**HTTPアダプターでは接続できましたが、OData V4アダプターでは接続できなかったようです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4d807006-4e00-321a-62f2-2cb230ea69b4.png)
エラーの詳細は以下です。`unable to find valid certification path to requested target`というのが根本原因のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/04c59ff8-4709-16cf-5b05-fe30528028ad.png)

## トラブルシューティング
以下のノートによると、ODataV4の場合は接続先のホストの証明書の他に、EDMXが参照する外部のEDMXファイルにかかわる証明書が必要になるそうです。
https://launchpad.support.sap.com/#/notes/0002891906
EDMXファイルを開くと、以下の部分があります。`https://oasis-tcs.github.io`の証明書が必要ということになります。

```xml
  <edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Capabilities.V1.xml">
    <edmx:Include Alias="Capabilities" Namespace="Org.OData.Capabilities.V1"/>
  </edmx:Reference>
```
証明書をダウンロードするには、ブラウザに`https://oasis-tcs.github.io`と打ち込み、"Certificate"をクリックします。詳細な手順については以下のノートをご参照ください。
https://launchpad.support.sap.com/#/notes/2715005
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e4a737fe-ac45-e17e-76ea-b9ff389a09a0.png)
証明書をダウンロードしたら、Keystoreからインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/7079ffde-4adf-b283-846b-e1e9a18672e1.png)
Add>Certificateより、ダウンロードした証明書を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/a3caff3f-b456-ac14-5c2d-d1114995cfa7.png)
証明書が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f3fb971c-5d59-f9f7-1608-9aa0736c0671.png)

念のため`oasis-tcs.github.io`への接続をテストしてみると、正常に終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9959c64f-e9ab-6a30-1dd7-8a12dffe2ec5.png)

このあとフローを再度デプロイすると、正常に終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2051dd8a-a53b-2a43-8ae3-87ee9bde2f9c.png)

## まとめ
ODataサービスを呼ぶという簡単なシナリオでしたが、わかったことがいくつかありあす。

- HTTPリクエストのヘッダは事前にContent Modifierで作成しておく必要がある
- OData V4を使う場合、接続先ホスト以外にも証明書が必要になる
- Connectivity Testをやっておくと吉（接続の問題なのかフローの問題なのかが切り分けれられる）
- 証明書エラーはよく起きる。起こったら粛々と証明書をインポートすること