[更新]DataPower PlaygroundでGatewayScriptを試す

## 2019/9/25 追記
DataPower Playgroundはサンセットしてしまいました。。


## はじめに
[DataPower Playground](https://developer.ibm.com/datapower/datapower-playground)は、DataPowerユーザーがGatewayScript開発学習を気軽にするためのクラウド環境とのことです。IBM Cloud上にDataPowerがホスティングされているようです。サンプルコードも色々提供されていますし、APIリファレンスも充実しています。
無償で気軽にコードを試せるというメリットがありつつ、時折「昨日は動いてたのに、今日は502 Bad Gateway♥」なんて時もあります。そこは無償ゆえのサービスレベルと割り切って使うのが良いかと思います。

## 試したシナリオ
API Connect v5.0.8.xでは、APIに対してクライアントIDをヘッダにつけてリクエストする場合、X-IBM-Client-Idという固定のヘッダで受け付けるという制限事項があります。とはいえベンダー名がもろに出てるヘッダを使いたくないというケースもあります。例えばX-Client-Idを使いたいと言った場合、一旦そのヘッダでリクエストを受け付けてDataPowerでそれをX-IBM-Client-Idに変換することで乗り切ることができます。
そこで必要となるコード例をPlaygroundで試してみます。

## サンプルコード
他にも書き方は色々あると思いますが、ここでのコード例は以下の通りです。

```GatewayScript.js
var hm = require('header-metadata');
var sm = require('service-metadata');
var log = session.name('log') || session.createContext('log');

var clientId = hm.current.get('x-client-id');
console.info(hm.current.headers);

if (clientId) {
    log.setVar('clientId', clientId);
    hm.current.remove('x-client-id');
    hm.current.set('x-ibm-client-id', clientId);
} else{
    hm.response.statusCode = '401';
    session.output.write("You need Client ID");
    console.log(hm.response.statusCode);
    return;
}

session.output.write(hm.current.headers);
console.info(hm.current.headers);
```

## 実行結果
1. Code画面にコードをコピペします。
![Kobito.EcfU6Z.png](https://qiita-image-store.s3.amazonaws.com/0/129662/44a3938b-ae0a-7da2-ffac-e78ff0f47748.png "Kobito.EcfU6Z.png")


2. Request画面でx-client-idヘッダと値をAddして、Testをクリックします。
![Kobito.E680hW.png](https://qiita-image-store.s3.amazonaws.com/0/129662/abdc5086-6d3a-1880-583a-cf598edc8029.png "Kobito.E680hW.png")


3. Response画面にクライアントに返る結果が表示されます。
![Kobito.SsMl11.png](https://qiita-image-store.s3.amazonaws.com/0/129662/422d0edf-37c8-7496-4e9d-45cd2c31dab4.png "Kobito.SsMl11.png")


4. Log画面にDataPowerのシステムログが表示されます。ここでコードに書いたように、変換前のヘッダと、変換後のヘッダが出力されています。
![Kobito.kGfrh5.png](https://qiita-image-store.s3.amazonaws.com/0/129662/941ea97a-a63e-df21-c85e-56b5a18298e0.png "Kobito.kGfrh5.png")

5. クライアントIDヘッダをつけずにリクエストしてみます。Request画面で先ほどのクライアントIDヘッダをremoveしてTestをクリックします。
![Kobito.VJRHN1.png](https://qiita-image-store.s3.amazonaws.com/0/129662/869474c4-cf25-4ac8-a463-fbad0b9c0256.png "Kobito.VJRHN1.png")

6. 以下のようなエラーとなります。
![Kobito.1lgcyV.png](https://qiita-image-store.s3.amazonaws.com/0/129662/bd73cc1e-c868-8657-2a8b-0e4391accc58.png "Kobito.1lgcyV.png")

7. Response画面には設定したメッセージが出ます。
![Kobito.MiQ1MJ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/e3238e40-243d-482a-0fdc-a2ec26d0b333.png "Kobito.MiQ1MJ.png")

8. Log画面には設定したエラーコードが出力されます。また4で出力されていたクライアントIDヘッダは当然出力されません。
![Kobito.1EH2vI.png](https://qiita-image-store.s3.amazonaws.com/0/129662/02267c77-b2e7-0358-9d58-73d692febc26.png "Kobito.1EH2vI.png")


## まとめ
以上でDataPower Playgroundを使って気軽にGatewayScriptのコードを試すことができることがわかりました。
なお注意点としてはAPI ConnectのAPI managerのアセンブルで使えるモジュールの[apim.custom.js](https://www.ibm.com/support/knowledgecenter/en/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/rapim_gwscript_codesnip.html)はここでは使えません（なので[APICコンテキスト変数](https://www.ibm.com/support/knowledgecenter/ja/SSFS6T/com.ibm.apic.toolkit.doc/rapim_context_var.html)は使えません）。
あくまでDataPower単体でのGatewayScriptという位置付けになります。

## 参考

* https://developer.ibm.com/datapower/datapower-playground/
* https://www.ibm.com/developerworks/community/blogs/de2b7f3e-30c5-4172-be0f-2640ebb55d13/entry/DataPower_Playground_execute_GatewayScript_in_your_browser?lang=en
* https://github.com/ibm-datapower/datapower-playground
* https://developer.ibm.com/recipes/tutorials/api-connect-customising-http-headers-for-client-id-and-secret/