IBM API Connect V5.0.8.3 Catchエラーの追加

### 概要
IBM API Connectのアセンブリでは、その処理においてエラーが発生した場合にCatchを構成する事で、エラー発生時の挙動をカスタマイズできます。

API Connect V5.0.8.3以降で、ハンドリングできるエラーが追加されています。ここでは、追加された例外の中で、UnauthorizedErrorの挙動を確認してみたいと思います。


- [What's new for this release V5.0.8](https://www.ibm.com/support/knowledgecenter/en/SSMNED_5.0.0/com.ibm.apic.overview.doc/overview_whatsnew.html#overview_whatsnew__tab-9)

### アセンブリでサポートされるエラーの一覧
以下が、アセンブリでサポートされるエラーの一覧になります。

| 例外             |概要　　　　　　　　　|備考　　　　　　    |
|-----------------|------------------|------------------|
|ConnectionError  |別の URL との接続を確立する際にエラーが発生しました。||
|JavaScriptError  | ポリシー内で JavaScript または GatewayScript を実行中にエラーが発生しました。||
|PropertyError    |アクションが設定、追加、クリアされていない状態で、set-variable ポリシーの呼び出し中または実行中に、正しくないプロパティーが原因でエラーが発生しました。||
|RedactionError   |redact ポリシーの一部としてフィールドを編集する際にエラーが発生しました。||
|TransformError   |transformation ポリシーの実行中にエラーが発生しました。||
|RuntimeError     |上記以外の指定されていないエラーが発生しました。|            |
|BadRequestError  |An error occurred while trying to access the request.| V5.0.8.3 以降 |
|UnauthorizedError|The API cannot be invoked based on the client ID and/or client secret provided, or id/secret were specified in the wrong location.| V5.0.8.3 以降 |
|ForbiddenError   |The application making the API request has been disabled or is not active.| V5.0.8.3 以降 |

- [Error cases supported by assembly catches](https://www.ibm.com/support/knowledgecenter/en/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/ref_toolkit_catch_errors.html)


### UnAuthorized Errorの構成と実行例
UnAuthorizedError Catchを構成してAPI Callをしてみます。
API定義のアセンブリ画面で、Catchを表示します。
UnAuthorizedError Catchを追加し、GatewayScriptポリシーを配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193979/f16bb711-ddd1-09a3-815d-5811a9f7b6cf.png)

このGatewayScriptポリシーでは、例として以下のように、ステータスコード、エラーメッセージを設定します。

```
var obj = {
    "status"  : "UnauthorizedError Catch ",
        "message" : "Response Message"
};
apim.setvariable('message.status.code', '401');
apim.setvariable('message.headers.content-type', 'application/json');
apim.setvariable('message.body', obj);
```


このような構成をしたAPIを公開し、実際に、クライアントIDの指定を間違えて、APIを呼び出してみます。

- クライアントIDが間違っている場合

curl -i -H "x-ibm-client-id: 3b530653-19f6-4ae0-b727-2a5a87776e8" https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current
HTTP/1.1 401 Unauthorized
(中略)
content-type: application/json

{"status":"UnauthorizedError Catch ","message":"Response Message"}

- クライアントIDの指定場所が違う場合

curl -k -i https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current?client_id=3b530653-19f6-4ae0-b727-2a5a87776e8e
HTTP/1.1 401 Unauthorized
(中略)
content-type: application/json

{"status":"UnauthorizedError Catch ","message":"Response Message"}


これにより、クライアントID、クライアントシークレットの値や指定方法が間違った場合のエラーメッセージや挙動をカスタマイズできます。
従来は、DataPower拡張などでの対応が必要でした。


参考までに、catchを構成しない場合のエラー時の応答例は、以下になります。

- クライアントIDが間違っている場合
$ curl -i -H "x-ibm-client-id: 3b530653-19f6-4ae0-b727-2a5a87776e8" https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current
HTTP/1.1 401 Unauthorized
Content-Type: application/json
(省略)
{ "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Invalid client id or secret." }

- クライアントIDの指定場所が違う場合
curl -k -i https://api.au.apiconnect.ibmcloud.com/xxxxx-apic/sb/simple/current?client_id=3b530653-19f6-4ae0-b727-2a5a87776e8e
HTTP/1.1 401 Unauthorized
Content-Type: application/json
(省略)
{ "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Client id in wrong location." }


###参考情報
- [IBM API Connect アセンブル作成ガイド](https://www.ibm.com/developerworks/jp/websphere/library/connectivity/apic/assemble-guide/index.html)
- [Handling errors in the assembly](https://www.ibm.com/support/knowledgecenter/en/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/task_toolkit_catch.html)
- [Throwing and catching errors in IBM API Connect](https://developer.ibm.com/apiconnect/2016/04/06/throwing-and-catching-errors-in-ibm-api-connect/)