#FeatureBlog - 19.4 - ライブラリに SOAP / Swagger ベースの Web サービスを追加する
このブログ記事は #FeatureBlog - 19.4 - SOAP and Swagger (based REST services for Library projects) を元に作成されており、日本のユーザー向けに修正と加筆を行っています。原文は こちら をご覧ください。
はじめに
SOAP または Swagger ベースの Web サービスと連携するワークフローを開発するときに、Studio 上でリクエストの構築に苦労した経験はありませんか?
UiPath 2019 ファスト トラックから、ライブラリ プロジェクトにサービスを追加できる機能が登場しました。これにより、SOAP または Swagger ベースの Web サービスと UiPath の連携がよりシンプルになりました。
本記事では、[新しいサービス (New Service)] 機能を使い、ライブラリにサービスを追加する方法を紹介します。また、ライブラリに追加されたサービスを使用し Orchestrator のプロセスを実行する例も、チュートリアル形式で解説します。
新規ライブラリを作成し、サービスを追加する
-
Studio を立ち上げ、スタートメニューから [新規プロジェクト (New Project)] > [ライブラリ (Library)] を選択します。[新しい空のライブラリ (New Blank Library)] ダイアログが表示されるので、[名前 (Name)] と [説明 (Description)] をそれぞれ入力してください。
-
新規ライブラリを作成した後、Studio の [デザイン (Design)] タブの [新しいサービス (New Service)] を選びます。もしくは、[プロジェクト (Project)] パネルの [サービス (Services)] の上で右クリックし、[新しいサービス (New Service)] を選びます。
-
[サービスエディター (Service Editor)] が開くので、[ファイルまたはリンク (File Or Link)] フィールドに、SOAP/Swagger サービスが提供する WSDL ファイル/Swagger ファイルの URL を指定してください。サービス記述が WSDL または Swagger 形式であれば、どの URL でも指定することができます。今回の例では、Orchestrator API の Swagger URL を使用します。
※ご利用の Orchestrator API Swagger の URL がわからない場合は こちらのガイド を参考にしてください。Swagger ドキュメントの URL は、Swagger ページ上部から取得可能です。
-
[読み込み (Load)] ボタンをクリックします。読み込みには少々時間がかかります。
-
読み込みが完了すると、指定したサービスの利用可能なエンドポイントがすべて表示されます。[名前空間 (Namespace)] は好きな名前空間に変えることもできます。今回は例として、[名前空間 (Namespace)]に既定の名前空間ではなく、OrchestratorAPI と入力しました。[保存 (Save)] ボタンをクリックし、[サービスエディター (Service Editor)] 画面を閉じます。
新しいサービスが追加されると、次のように [プロジェクト (Project)] パネル上に新しいサービスが追加されたのがわかります。
ライブラリ アクティビティを作成する
次の情報を引数として取り、Orchestrator のプロセスを開始するアクティビティを作成します。
- Orchestrator ログイン ID
- Orchestrator ログイン パスワード
- フォルダー名
- プロセス名
- ロボット名
プロセスを開始するにあたって、上記の引数をそのままリクエストのパラメーターとして使用することはできません。以下のステップを踏んで、プロセスの開始に必要なパラメーターを取得する必要があります。
- セッション認証を行い、Bearer トークンを取得する
- フォルダー名から Folder Id を取得する
- ロボット名から Robot Id を取得する
- プロセス名から Release Key を取得する
- プロセスを開始する
上記のステップでは、次の 5 つの Orchestrator API エンドポイントを使用します。
POST /api/Account/Authenticate
GET /odata/Folders
GET /odata/Robots
GET /odata/Releases
POST /odata/Jobs/UiPath.Server.Configuration.OData.StartJobs
※上記のエンドポイントにリクエストする際に認証ユーザーが必要な権限を持っていないと、リクエストが失敗します。エンドポイントごとに必要となる権限については Orchestrator ガイド をご参照ください。
それぞれのエンドポイントに対してライブラリ アクティビティを作成することにより、機能のモジュール化をすることができます。したがって大規模なプロジェクトの場合は、API 呼び出しごとに異なるワークフローを作成したほうが望ましいでしょう。しかし、今回はワークフローを簡略化するために、それぞれの API 呼び出しをする合計 5 つのシーケンスを 1 つのワークフロー ファイル内に作成します。
それでは、Studio に戻ってアクティビティの作成をします。
シーケンスの追加と引数の作成
-
新規の [フローチャート (Flowchart)] を作成し、[名前 (Name)] に適切な名前を入力します。今回は例として
StartProcess_SpecificRobot
という名前にしました。ライブラリ プロジェクトを作成すると既定で生成されるNewActivity.xaml
ファイルは削除します。[プロジェクト (Project)] パネルは次のようになります。 -
API 呼び出しごとに [シーケンス (Sequence)] アクティビティを追加します。今回 5 つのエンドポイントに対しリクエストをするため、5 つの [シーケンス (Sequence)] アクティビティを追加します。それぞれアクティビティの [表示名 (Display Name)] は、画像内の例のようにわかりやすいものに変更します。アクティビティの追加後は次のようになります。
-
次に、サービスの名前空間をワークフローに追加します。次のように [インポート (Imports)] パネルから名前空間
OrchestratorAPI
の追加をします。 -
必要な引数をすべて定義します。合計 7 つの引数を定義します。
引数 方向 引数の型 説明 TenantName
入力 String
Orchestrator テナント名 Username
入力 String
Orchestrator ユーザー名 Password
入力 SecureString
Orchestrator パスワード FolderName
入力 String
ロボットとプロセスが所属するフォルダー名 ProcessName
入力 String
開始するプロセス名 RobotName
入力 String
プロセスを実行するロボット名 Status
出力 String
API 呼び出し結果のステータス -
これら 7 つの引数を追加した後は、[引数 (Arguments)] パネルは次のようになります。
認証シーケンス
-
最初に 認証 シーケンスから編集をします。[アクティビティ (Activities)] パネルから [Authenticate] アクティビティを検索します。
[Authenticate] アクティビティを 認証 シーケンスに追加します。[Authenticate] アクティビティのプロパティは非常にたくさんありますが、今回着目するプロパティは [LoginModel] と [Response] の 2 つのみになります。この 2 つのプロパティに対し、適切な型を選んで変数を作る必要があります。フィールド上で
Ctrl + K
ショートカット キーを押し、変数を作成するのが一番手っ取り早い方法になります。[LoginModel] プロパティに対しては、
OrchestratorAPI.LoginModel
型のAuthenticateLoginModel
という名前の変数を作ります。下記スクリーンショットのように、[既定値 (Default)] にNew OrchestratorAPI.LoginModel
と入力し、変数の初期化を行ってください。一方、[Response] プロパティに対しては、OrchestratorAPI.AjaxResponse
型のAuthenticateResponse
という名前の変数を作ります。AuthenticateResponse
変数は API のリクエスト結果を格納するための変数であるため、変数の初期化は不要です。 -
AuthenticateLoginModel
変数の 3 つのプロパティに対し値を代入していきます。Orchestrator API Swagger ページのPOST /api/Account/Authenticate
エンドポイントを参照すると、どのプロパティに、どのような型のデータを設定すべきかがわかります。2 つの [代入 (Assign To)] アクティビティを [Authenticate] アクティビティの前に追加し、それぞれ [左辺値 (To)] と [右辺値 (Value)] に、次のように値を代入します。
左辺値 (To) 右辺値 (Value) AuthenticateLoginModel.TenancyName
TenantName
AuthenticateLoginModel.UsernameOrEmailAddress
Username
-
次に、パスワードの設定を行います。
AuthenticateLoginModel.Password
はString
型です。一方、引数Password
はSecureString
型であるため、代入前にString
型に変換する必要があります。 変換後の平文のパスワードを保持するためのString
型変数をPlainPassword
という名前で作成します。[代入 (Assign To)] アクティビティを追加し、[左辺値 (To)] と [右辺値 (Value)] に、次のように値を設定します。
左辺値 (To) 右辺値 (Value) PlainPassword
New System.Net.NetworkCredential(String.Empty, Password).Password
PlainPassword
変数に平文のパスワードを格納後、そのPlainPassword
変数をAuthenticateLoginModel.Password
に代入をします。左辺値 (To) 右辺値 (Value) AuthenticateLoginModel.Password
PlainPassword
-
認証 シーケンスは次のようになります。
-
最後に、[Authenticate] アクティビティが返す Bearer トークンを保持する
String
型の変数を作成します。この変数にBearerToken
という名前をつけます。Bearer トークンは他のシーケンスで使用する必要があるため、変数の [スコープ (Scope)] をStartProcess_SpecificRobot
に変更します。BearerToken
変数には [Authenticate] アクティビティが返すレスポンスのResult
プロパティ (Object
型) の値を代入します。BearerToken
変数はString
型であるため、代入するときにToString
メソッドを使いString
型に変換します。[左辺値 (To)] と [右辺値 (Value)] は次のようになります。
左辺値 (To) 右辺値 (Value) BearerToken
AuthenticateResponse.Result.ToString
Folder Id の取得シーケンス
-
Folder Id を取得するシーケンスを作ります。[フォルダー (Folder)] とは UiPath 2019.10 LTS で追加された機能です。これまでの [組織単位 (OrganizationUnit)] と似た機能を提供し、ユーザーのアクセス コントロールやリソースを分離する役割があります。詳細は こちら のガイドをご参照ください。
-
[アクティビティ (Activities)] パネル上で [GetFolders] アクティビティを検索し、Folder Id の取得 シーケンスに追加します。さきほどの [Authenticate] アクティビティと同様に、[GetFolders] アクティビティにもたくさんのプロパティが存在しますが、[Response] と [Filter] と [BearerToken] の 3 つのプロパティに対してのみ設定をします。
-
[Response] プロパティ上で
Ctrl + K
ショートカット キーを押し、変数FoldersResponse
を作成します。[Filter] プロパティには、フォルダーをフィルタリングする際の条件式を代入します。条件式は次のようになります。"DisplayName eq '" + FolderName + "'"
-
[BearerToken] プロパティには作成済みの変数
BearerToken
を代入します。[GetFolders] アクティビティの [プロパティ (Properties)] パネルは次のようになります。
-
[GetFolders] アクティビティのプロパティの設定が終わった後、[代入 (Assign To)] アクティビティを [GetFolders] アクティビティの後に追加します。[代入 (Assign To)] アクティビティの [右辺値 (Value)] に
FoldersResponse.Value(0).Id
を入力し、[左辺値 (To)] フィールド上でCtrl + K
ショートカット キーで新しい変数を作り、その変数の名前をFolderId
にします。左辺値 (To) 右辺値 (Value) FolderId
FoldersResponse.Value(0).Id
FolderId
変数はGenericValue
型で生成されるため、Nullable<Int64>
型に変更します。さらに、この変数は他のシーケンスでも使いたいので、[スコープ (Scope)] をStartProcess_SpecificRobot
に変更します。[変数 (Variables)] パネルは次のようになります。
Robot Id の取得シーケンス
-
Robot Id を取得するシーケンスを作ります。
[GetRobots] アクティビティを [アクティビティ (Activities)] パネルで検索し、Robot Id の取得 シーケンスに追加します。そして [GetRobots] アクティビティの [Response] プロパティ上で
Ctrl + K
ショートカット キーを押し、新たな変数RobotsResponse
を作成します。 -
さきほどの [GetFolders] アクティビティと同じように、ロボットも名前でフィルタリングしたいので、[Filter] プロパティに次の式を入力します。
"Name eq '" + RobotName + "'"
-
次に、どのフォルダーに所属するロボットなのかを指定する必要があります。[X_UIPATH_OrganizationUnitId] プロパティに作成済みの
FolderId
変数を代入します。 -
最後に [BearerToken] プロパティに
BearerToken
変数を代入し、[GetRobots] アクティビティ プロパティの設定は終了となります。 -
Robot Id の取得 シーケンスに戻ります。[代入 (Assign To)] アクティビティを [GetRobots] アクティビティの後に追加します。[代入 (Assign To)] アクティビティの [左辺値 (To)] と [右辺値 (Value)] には次のように入力してください。
RobotId
変数は新たに作成する必要があります。Nullable<Int64>
型にし、[スコープ (Scope)] をStartProcess_SpecificRobot
に変更します。左辺値 (To) 右辺値 (Value) RobotId
RobotsResponse.Value(0).Id
Robot Id の取得 シーケンスと [変数 (Variables)] パネルは次のようになります。
Release Key の取得シーケンス
-
Release Key の取得 シーケンスは、上述の Robot Id の取得 シーケンスの作成手順とほとんど変わりません。
プロセスを取得するには [GetReleases] アクティビティを使用します。このアクティビティにも [Filter] プロパティが存在するので、次の式を入力し、プロセス名でフィルタリングを行います。
"Name eq '" + ProcessName + "'"
-
Release Key を取得するために、[代入 (Assign To)] アクティビティを追加します。[左辺値 (To)] と [右辺値 (Value)] は次のように入力します。
ReleaseKey
変数をString
型で作成し、[スコープ (Scope)] の変更をすることも忘れないでください。左辺値 (To) 右辺値 (Value) ReleaseKey
ReleasesResponse.Value(0).Key.ToString
ジョブの開始シーケンス
-
それでは最後のシーケンス、ジョブの開始 の編集作業に入りましょう。このシーケンスでは、これまでのステップで取得した
BearerToken
、FolderId
、RobotId
そしてReleaseKey
を組み合わせて API リクエストを構築します。 -
[StartJobs] アクティビティを [アクティビティ (Activities)] パネルから “ジョブの開始” シーケンス上にドラッグ アンド ドロップします。プロパティ [StartJobParameters] 上で、
Ctrl + K
ショートカット キーを押し、OrchestratorAPI.StartJobParameters
型の新しい変数StartJobParams
を作成します。[変数 (Variables)] パネルでStartJobParams
変数の [既定値 (Default)] にNew OrchestratorAPI.StartJobParameters
と入力します。 -
[Response] プロパティに対しても新しい変数
StartJobResponse
を作成し、代入をします。この変数の型はOrchestratorAPI.ODataResponseOfListOfJobDto
になります。 -
[X_UIPATH_OrganizationUnitId] と [BearerToken] プロパティには、これまでと同様に
FolderId
変数とBearerToken
変数をそれぞれ代入します。 -
次に、
StartJobParams
変数の設定を行います。[Authenticate] アクティビティにパラメーターを設定したときと同じように、どのプロパティに値を設定しないといけないかを Orchestrator API Swagger ページで確認します。POST /odata/Jobs/UiPath.Server.Configuration.OData.StartJobs
エンドポイントの [Data Type] は次のように定義されていることがわかります。 -
まず、StartJobParameters 型のオブジェクトの
StartInfo
プロパティを初期化します。[代入 (Assign To)] アクティビティを[StartJobs] アクティビティより前に追加してください。左辺値 (To) 右辺値 (Value) StartJobParams.StartInfo
New OrchestratorAPI.StartProcessDto
-
StartInfo
プロパティの初期化後、3 つの [代入 (Assign To)] アクティビティを追加します。さらに、StartInfo
のRobotIds
、ReleaseKey
、Strategy
プロパティに値を代入します。次のスクリーンショットのようになります。
上から順に [左辺値 (To)] と [右辺値 (Value)] を、次のように設定します。今回、特定のロボットの Id を指定してジョブを開始するため、
StartJobParams.StartInfo.Strategy
にOrchestratorAPI.StartProcessDtoStrategy.Specific
を代入しています。左辺値 (To) 右辺値 (Value) StartJobParams.StartInfo.RobotIds
{CLng(RobotId)}
StartJobParams.StartInfo.ReleaseKey
ReleaseKey
StartJobParams.StartInfo.Strategy
OrchestratorAPI.StartProcessDtoStrategy.Specific
-
これで [StartJob] アクティビティを実行するために必要な準備が整いました。リクエストの結果を出力引数の
Status
に格納する必要があるので、[StartJob] アクティビティの後に [代入 (Assign To)] アクティビティを追加し、[左辺値 (To)] と [右辺値 (Value)] に次のように入力をします。左辺値 (To) 右辺値 (Value) Status
StartJobResponse.Value(0).State.ToString
テスト実行
-
プロセスを開始するリクエストの結果を出力コンソール上で確認するため、[一行を書き込み (Write Line)] アクティビティを追加します。
-
[引数 (Arguments)] パネル上で [入力 (In)] 引数すべてに値を入力し、ワークフローを実行します (
Ctrl + F6
ショートカット キー)。Password
引数に対しては、テスト目的なので次の式を代入します。第 2 引数には Orchestrator にログインするときに使うパスワードを平文で設定してください。New System.Net.NetworkCredential(String.Empty, "Orchestrator平文パスワード").SecurePassword
実行が成功すると、出力コンソール上に [Pending] という文字列が表示されます。
[Pending] と表示されていますが、これはプロセスを実行するロボットが、Orchestrator にハートビートを送る次のタイミングで、プロセスが開始されるためです。
テストが終わったら、[引数 (Arguments)] パネルで設定した既定値を必ず削除するようにしてください。
サンプル ライブラリ プロジェクト
サンプルは こちら からダウンロードできます。
Orchestrator API の Swagger URL として、ダミーの URL: https://platform.uipath.com:443/swagger/docs/V2
が設定されています。こちらはご自分の Orchestrator API の Swagger URL に変更する必要があります。
また、こちらのサンプル ライブラリ プロジェクトをダウンロードまたはクローンし、Studio から開くと次のようにアクティビティが正常に読み込めないというエラーが表示されます。これは、Studio でこのプロジェクトを初めて開くときに発生する問題です。
エラーは以下の手順で解決できます。
-
[プロジェクト (Project)] パネルの [サービス (Services)] 内に表示される、OrchestratorAPI を右クリックし、表示されたコンテキスト メニューから [サービスを修復 (Repair Service)] を選ぶことで解決できます。ただし、今回は Orchestrator API の Swagger URL も変更する必要があるので、コンテキストメニューから [サービスを編集 (Edit Service)] を選びます。
-
[サービスエディター (Service Editor)] が表示されるので、[ファイルまたはリンク (File or Link)] テキストフィールド内の URL をご利用中の Orchestrator の Swagger URL と書き換えてください。書き換え後は [読み込み (Load)] ボタンを押します。
-
エンドポイントの読み込みが終わると、[名前空間 (Namespace)] が既定の名前空間で上書きされてしまうので、OrchestratorAPI と入力し直します。最後に [保存 (Save)] ボタンを押します。
おわりに
読者の皆さんはこのライブラリをパブリッシュし、別のワークフローからライブラリ アクティビティを呼び出すところまでチャレンジしてみてください