はじめに
OutSystemsから外部のRestAPIを呼び出し、そのHTTPステータスコードによりその後の処理を分岐させたい。
ConsumeRestAPIを定義し、外部APIを呼び出し、OnAfterResponseにてHTTPステータスコードを取得して、Response内に格納して返却するようにした。
しかし、500番が返却されるようにAPIを実行した場合、ConsumeRestAPIは例外を発生させてしまい、HTTPステータスコードを取得することができなかった。
ConsumeRestAPIが返却されたHTTPステータスコードによってどのような挙動をするのか調査してみた。
環境
Service Studio Version 11.54.37
検証
検証内容
呼び出したAPIのHTTPステータスコードによりConsumeAPIはどう例外を発生させるか。
検証用のExposeAPIの準備
GetのAPIを準備した。
URL内で返却するHTTPステータスコードを指定すると、その通りにレスポンスを返す単純なAPI。
検証用のConsumeAPIの準備
上記のExposeAPIを実行するConsumeAPI。
検証結果
ConsumeAPIを実行した結果。
ExposeAPIのHTTPステータスコードにより以下のように例外が発生した。例外の文言は基本的に「HTTPステータスコード 詳細」というメッセージになる。
100番台:例外
200番台:正常終了
300番台:正常終了
400番台:例外
500番台:例外
要求を実現するには
仮説
ConsumeAPIの後処理で、StatusCodeにより処理が分岐し200番台および300番台以外の場合は例外を発生させている?StatusCodeを上書きすることで例外を回避できないか。
検証用のConsumeAPIの準備
OnAfterResponse
でCustomizedResponse.StatusCode
を200番に上書きしたうえで、CustomizedResponse.ResponseText
にHTTPステータスコードを付加する。
検証結果
おおむね臨むとおりにHTTPステータスコードを取得することができた。
一部のHTTPステータスコードでは「サーバーによってプロトコル違反が発生しました. Section=ResponseStatusLine」との例外が発生してしまうことが分かった。
例えば、100
や102
で発生する。
以下は推測となる。
リクエストヘッダにExpect: 100-continue
を付加してアクセスするとリクエストを検証する、その際の応答として100
が返される。今回はその作法にのっとっていないため例外として処理されている可能性がある。
また、102
はすでに非推奨となっているコードのため例外として処理されている可能性がある。これらはOnAfterResponse
で置き換える前に例外が発生していると考えられ、400
番台等とは別の処理でエラーとなっていることが想像できる。
結論
OnAfterResponse
でCustomizedResponse.StatusCode
を200番に上書きしたうえで、CustomizedResponse.ResponseText
にHTTPステータスコードを付加する。
上記の方法によりHTTPステータスコードを取得することができた。しかしそれでもHTTPステータスコードによっては、回避できない例外が発生することを確認できた。
ConsumeAPIをラップする形でアクションを作成し、そこで例外をキャッチして処理を分岐するのが想定された処理なのでないかと考える。
もう少しOutsystemsのConsumeAPI処理の流れを理解してみたいと思った調査だった。