[Oracle Cloud] Groovyを使用した外部Webサービス呼出 

アプリケーション・コンポーザ（Application Composer）を使用し、Fusionから外部Webサービスを呼出すことができます。
呼出すコードはGroovy Scriptで実装できます。SOAP APIとREST APIに対応しています。

※アプリケーション・コンポーザ（Application Composer）は何かは別記事で記載予定。

## 前提条件

* OIC(Oracle Integration Cloud)にREST APIを構築し、それを呼出対象とします。
* REST APIの認証方式はベーシック認証
* GETメソッドを使用します
* URLパラメータが２つある想定
* Content-Typeはなし

Fusionにカスタムオブジェクトを作成し、カスタム画面でパラメータを選んで、REST APIを呼出します。

## REST APIの呼出手順

サンドボックスをアクティブ化し、アプリケーション・コンポーザを開きます。
下記手順はアプリケーション・コンポーザでの操作になります。

### 1. カスタム・オブジェクトを作成します。

オブジェクト-カスタム・オブジェクトの「作成」ボタンを押下し、必要な情報を入力します。

### 2. Webサービスを登録します。

共通設定-Webサービスを開きます。「作成」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/c870acbb-b4af-c000-2fb5-7981b47db905.png)

RESTを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/0fa004f2-19e8-335c-171d-75f55fec2648.png)

必要な情報を登録します：

* 名前：Webサービスに名前を付けます。Groovyでこの名前を使用します。
* URL：REST APIのURL。{}のように変数を入れます。
* 認証スキーム：今回はベーシック認証を使用します。
* GETメソッドを選択します。
* リクエスト・ペイロード、レスポンス・ペイロードは指定なしにします。

ベーシック認証に使用する資格証明キーがないと、GroovyでAPI呼出時に認証エラーになってしまうので、登録する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/66ed98f0-6175-ad8c-f782-e445dd300d8b.png)
 
+ボタンで資格証明キー情報を作成します。

* CSFキー：[Create a CSF Key](https://docs.oracle.com/en/cloud/paas/integration-cloud/erp-adapter/prerequisites-creating-connection.html#GUID-C179F26D-7409-43D7-B87B-E508A1DF7314)
* ユーザ名：ベーシック認証ユーザ名
* パスワード：ベーシック認証パスワード

### 3. URLパラメータ用フィールドを作成します。

作成したカスタムオブジェクトの「フィールド」画面を開きます。必要なフィールドを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/910c9f82-6609-697c-10f9-4aa75ab460b2.png)

### 4. ページにフィールドを追加します。

作成したカスタムオブジェクトの「ページ」画面を開きます。対象ページにフィールドを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/06c36d48-d21b-d3bd-e06c-c94b0121293e.png)

### 5. Groovy Scriptを実装します。

作成したカスタムオブジェクトの「サーバー・スクリプト」画面を開きます。「オブジェクト関数」タブを選び、「追加」ボタンを押下し関数を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/e7554a5d-da23-2ec5-8419-64df44b985e1.png)

関数名はあとで画面上のボタンと紐付けて関数を使用します。
今回のGroovyコード：

```groovy
// Query for REST API
println("Enter REST API Script.")
def myParameter01 = Parameter01_c //登録したフィールドの物理名
def myParameter02 = Parameter02_c //登録したフィールドの物理名

def urlparam = "urlparam?name1=" + myParameter01 + "&value1=" + myParameter02

println("urlparam=" + urlparam)

def conn = adf.webServices.REST_API //REST_APIは登録したWebサービス名
try {
  def httpHeaders=['Content-Type':'']
  conn.requestHTTPHeaders=httpHeaders
  def WSResponse = conn.GET(urlparam)

  if(!WSResponse)
    println("Did not receive a response from REST API.")
  else {
    println("Did receive a response from REST API.")
  }
} catch(Exception e) {
  println("Headers:"+conn.responseHTTPHeaders)
  println("Status:"+conn.statusCode)
  println("Error:"+e)
}
```

注意しておきたいのは、httpヘッダのContent-Typeは、アプリケーション・コンポーザがデフォルトで"application/json"にしているようです。REST API側の設定に合わせないと、415 Unsupported Media Typeエラーが出ます。

また、printlnで出力したログは、共通設定-「ランタイム・メッセージ」画面で確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/de70dd8a-2bc2-9f72-f413-3fc7a65af27c.png)

※ロギングの有効化が選択されていることが前提条件

### 6. ボタンとGroovy Scriptを紐づけます。

作成したカスタムオブジェクトの「処理およびリンク」画面を開きます。「作成」ボタンを押下し、必要な情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/27f8da6e-a3c6-a7b8-dbe1-18a7ebd279b4.png)

### 7. ページにボタンを追加します。

パラメータフィールドを設定したページに、作成したボタンを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/ca38eba5-2a46-30b3-41c2-2af06b5101a5.png)

### 8. セキュリティを設定します。

作成したカスタムオブジェクトの「セキュリティ」画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/9856da78-0f86-6b5a-18a3-ef74600e693b.png)

※ カスタムオブジェクトをアクセスするには、Custom Objects Administration (ORA_CRM_EXTN_ROLE)のロールが必要になります。

上記で一通り手順が終了です。作成したページをホーム画面またはナビゲータにリンクを追加したい場合は、[Home Page and Navigation](https://docs.oracle.com/en/cloud/saas/applications-common/21b/oaext/home-page-and-navigation.html#OAEXT1642649)を参照してください。