OutSystems環境からHTTP通信を行う方法

OutSystemsでHTTPリクエストを投げる主な方法を挙げてみる。
以下で示すサンプル実装で利用するメソッドはGETで統一。

# 環境
Personal Environment(Version 11.14.0 (Build 33133))
Service Studio(Version 11.14.12)
ardoHTTP(Version 1.2.5)

# サンプル実装で使うURL
OutSystemsのExpose REST APIで以下のものを用意した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5b142dba-08c2-c993-9a8d-2c1953977978.png)

Input Parameterとして、2つのInteger型（No1とNo2）を取り、以下の構造のOutput Parameterを返す。

- DateTime型
- Integaer型2つ

このサンプルURLにHTTPリクエストを行い、結果を取得する方法を以下にまとめる。

# GetRequest_Submit Action (HTTPRequestHandlerモジュール）
組み込みのAPIである[HTTPRequestHandlerモジュール](https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_APIs/HTTPRequestHandler_API)にある、GetRequest_SubmitというActionでGETリクエストを行える。
HTTPRequestHandler
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a008bce1-6ba5-a826-9a77-ae8c1e29b129.png)

## 特徴
製品に付属のAPIであるHTTPRequestHandlerの機能なので、新しいモジュールのインストールや開発が不要。

ただし、ヘッダを操作する機能が無い（HTTPRequestHandlerにはHeaderを操作するAPIもあるが、それはGetRequest_Submitでリクエストを行う際のヘッダではなく、OutSystemsから返すレスポンスヘッダを操作する機能）。

また、操作できるレスポンスのデータは、レスポンスボディに限られる。

## Input Parameter

- URL: アクセスしたいURL（例："https://ホスト/モジュール/rest/SampleURL/GetSample"）
- Arguments: クエリストリング（例：No1=123&No2=234)

Argumentsは文字列編集で作ってもいいけれども、同じモジュールのGetRequest_AddArgument Actionを使って組み立てることもできる。
「No1=123&No2=234」を組み立てる場合の例は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/fa492eb5-6a76-f290-320c-47d10c6f5d55.png)

## Output Parameter

- TextContent: レスポンスボディのテキスト表現（例：{"ResultDateTime":"2022-04-09T07:44:45Z","ResultNo1":133,"ResultNo2":244}）
- BinaryContent: レスポンスボディのバイナリ表現
- BinaryContentType: Content-Type (例：application/json; charset=utf-8）

## 環境ごとにURLを変更する
Site Propertyでアクセスする先のホストを保持することで、Service Center上でアクセスする先のURLを変更できる。

# Consume REST API
外部URLをREST APIとして処理する方法。
OutSystems標準機能のConsume REST APIを使って行う方法。
設定方法は、[1つまたは複数のREST APIメソッドを利用する](https://success.outsystems.com/ja-jp/Documentation/11/Extensibility_and_Integration/REST/Consume_REST_APIs/Consume_One_or_More_REST_API_Methods)を参照。

## 環境ごとにURLを変更する
OutSystemsのREST APIは、Service Center上でアクセスする先のURLを変更できる。
手順は、[実行時に利用するREST APIを設定する](https://success.outsystems.com/ja-jp/Documentation/11/Extensibility_and_Integration/REST/Consume_REST_APIs/Configure_a_Consumed_REST_API_at_Runtime)を参照。

## 通信ログ
Consumre REST APIを使うといいのは、通信ログを記録する機能も提供されていること。
これも、Service Center上でログレベルを変更する。ログレベルを上げて、Service CenterのIntegrationsログから通信内容を確認できるようになる（データサイズの問題があるため常時有効にすることは勧められていない）。

変更箇所は、URLと同じ場所で、Logging Levelという項目。これをFullに変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b1c3e458-e189-4998-bff9-ddfef4bb24e9.png)

# Forgeコンポーネント（ardoHTTP）
Forgeコンポーネントにも、HTTPを操作するコンポーネントがいくつかある。
その中でも、[ardoHTTP](https://www.outsystems.com/forge/component-overview/427/ardohttp)がTrustedで使いやすいので、使い方を確認してみる。

GETリクエストを送るのは、HTTPGet Action。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5000fec8-5aa4-26b8-f5b7-0de26cc9e745.png)

## Input Parameter

- URL: アクセスしたいURL。クエリストリングを含める（例："https://ホスト/モジュール/rest/SampleURL/GetSample?No1=123&No2=234"）
- Headers: リクエストヘッダ。NameとValueで構成されるStructureのList（上のスクリーンショットでは「CustomHeader: CustomHeaderValue」というヘッダを送っている）

## Output Parameter

- Status: HTTPレスポンスのステータスコードのテキスト表現（例：OK）
- Status_Code: HTTPレスポンスのステータスコード（例：200）
- Response: HTTPレスポンスボディ
- Response_Headers: レスポンスヘッダ。NameとValueで構成されるStructureのList

# Extension (C#)
コストはかかるが、代わりに最も細かいコントロールが効く方法。
他の方法で実現できない要求があるときにこの方法を取る。

ardoHTTPでもやっている、.NETの通信API（HttpWebRequest等）を使って、C#のExtensionとして作成する。