SAP Cloud PlatformのODataサービスでCRUD操作

#目的
SAP Cloud Platform上のテナントDBに作ったテーブルを
ODataサービスで公開したものをSAP UI5からCRUD操作したい

そのためにまずPostmanでCRUD操作ができるようにする

##参考資料
テナントDBの作成、ユーザー権限設定、テーブル設定、OData作成までは以下を参考
https://blogs.sap.com/2018/07/13/sap-cp-trial%E7%92%B0%E5%A2%83%E3%81%AEhana-db%E8%A8%AD%E5%AE%9A/

##ODataサービスからデータを取得する
ODataの操作は以下の通りHTTPMethodに対応しているのでデータ取得ならGETメソッドを使う

| HTTP Method | CRUD |
|:-:|:-:|
| GET | SELECT |
| POST | INSERT |
| PUT | UPDATE |
| DELETE | DELETE |


####参考資料の通りに作成したODataサービスからデータ取得方法

URLはSAP HANA Web-Based Development Workbench -> Editorでdemo.xsodataを実行した際のURLを使用する
↓のような感じ

```
https://<作成したHANAホスト>.hanatrial.ondemand.com/demo/demo.xsodata
```

URL末尾に`/makerdata`をつけることで`DEMO_USER. MAKERMASTER `のデータを表示
※.xsaccessで認証方法をBasicにしているため、テナントDBのUSER/PASSWORDの入力が必要

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/159467/75b9be22-f5a1-a464-615f-c10f90aca94e.png)

##ODataサービスを使って登録・更新・削除をする
登録・更新・削除はそれぞれPUT・POST・DELETEメソッドに対応しているが、
無邪気にリクエストを投げても４０３エラーが帰ってくる

XSアプリケーションの.xsaccessでPUT・POST・DELETEのメソッドが許可されていないので、
以下のように変更する

また、SAP UI5アプリケーションでのCRUD操作を想定してxhrFields項目を設定する
HTTPメソッドの許可だけではクロスドメインアクセスが行えないためWebアプリからのCRUDが実現できない

```
//変更前
{
    "exposed": true,
   //省略
    "prevent_xsrf": true,
   //省略
    "cors": [{
        "enabled": false
    }],

}
```

```
//変更後
{
    "exposed": true,
   //省略
    "prevent_xsrf": true,
   //省略
    "cors": [{
        "enabled": true,
        "allowMethods": ["GET","POST","PUT","DELETE","HEAD","OPTIONS"],
        "allowOrigin": ["*"], 
        "maxAge":"3600"
    }],
    "xhrFields" : {
        "withCredentials" : true
    },

}
```
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/159467/29c1c4f2-09f0-cecd-b785-ef5bb550a150.png)



####GETでtokenを取得する
PUT・POST・DELETEメソッドを受け入れる設定を行ったので、リクエストを送ってみる

その前にGETリクエストでトークンを取得する必要があるので、
HTTPヘッダーに以下を追加し、リクエストを送信する

| key | value |
|:-:|:-:|
|  X-CSRF-Token |  Fetch |

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/159467/ffe870ec-0540-8232-2d1f-24bc518f0f12.png)

レスポンスヘッダーの"x-csrf-token"項目からtokenが取れるので、
それをコピーしてまずPOSTを試してみる

####POSTメソッドでリクエスト（INSERT）
POSTのリクエストでデータのINSERTを行う
ヘッダーには以下を指定する

| key | value |
|:-:|:-:|
|  x-csrf-token | Fetchで取得したトークン  |
| Content-Type | application/json |

![３.png](https://qiita-image-store.s3.amazonaws.com/0/159467/9e3bac86-9123-14e9-851d-e9ff8bec706c.png)

Bodyには挿入するデータをJSON形式で記載

```
{
	"ID": "99"
	"NAME":"TEST"
}
```

<img width="1140" alt="スクリーンショット 2019-02-28 16.56.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/159467/b1119872-0e1c-1309-ac3e-a2fe8e421551.png">

成功すると`201 Created`が返却される
![４.png](https://qiita-image-store.s3.amazonaws.com/0/159467/c4a73324-e888-4077-00bd-503a882eb06f.png)


####PUTメソッドでリクエスト（UPDATE）
PUTのリクエストでデータのUPDATEを行う
HTTPヘッダー等はPOSTと同じだが、UPDATEを行うために単一行を指定する必要がある

今回はPOSTで挿入したデータを更新してみるので、URLの/makerdataの後ろに主keyのIDを追加

```
https://<作成したHANAホスト>.hanatrial.ondemand.com/demo/demo.xsodata/makerdata(99)
```

成功すると`204 No Content`が返却される
![５.png](https://qiita-image-store.s3.amazonaws.com/0/159467/c802cb14-8a1d-0f2d-9fbe-c5a4e8ee8ea1.png)

PUTをおこなってからGETリクエストを行うと更新されていることが確認できる
<img width="969" alt="スクリーンショット 2019-02-28 17.18.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/159467/24719256-ac0b-c965-6892-e7cd6fa6fb91.png">


####DELETEメソッドでリクエスト（DELETE）
DELETEのリクエストでデータのDELETEを行う
PUT同様に単一行を指定する

成功すると`204 No Content`が返却される
![６.png](https://qiita-image-store.s3.amazonaws.com/0/159467/25f9e329-4a73-c571-22e5-08ea29b80f7b.png)

GETで消えたことを確認するとこうなってる
![７.png](https://qiita-image-store.s3.amazonaws.com/0/159467/902b11a4-0889-d231-8fda-0470d85b9d9d.png)

##さいごに
とりあえずCRUDできるODataサービスになったので、
次はこれを使ってSAP UI5から呼び出してみる