見出し画像

Orchestrator連携系アクティビティに使うODataについて Vol.2-②

②で収まるといいな~と思ってます、ワッキーです。
本ブログ最後で、全て実装したサンプル添付しますので、何かのお役に立てていただければと思います!

①では、ReleaseKeyを取得しましたね!
Releasesの応答取得に使用したstrReleaseResponseという文字列変数を使いまわしましょう💦

strReleaseResponseにjobjResponse("Value")(0)("Key").ToString()を代入します

この時に、条件分岐などで、jobjResponse("Value")が一つデータ持っているか確かめるなどのエラー処理もすると良いかもですね

画像1

さて、次はロボットのIdです。


③Orchestrator への HTTP 要求アクティビティを使用して、RobotIdを取得してみましょう!

Process1に紐づいているロボットのログイン先のユーザー名「vvacky」と同じ名のロボットがOCにあります。この子のIdを取得しないと、UserName(=ロボット名)を指定してJobの実行はできません。
ログイン先環境ユーザー名なので初期化処理の際にユーザー名を環境変数から取得する処理を入れておきましょう。

画像2

画像の通り、ユーザー名(=ロボット名)をstrUserNameという文字列変数に取得します。

ロボットIDの取得に再び「Orchestrator への HTTP 要求」アクティビティを使用します。
ロボット情報なのでコンポーネント名はRobotsになります。

従って、エンドポイントの相対パスは

"/odata/Robots?$filter=Name eq"+strUserName+"&$select=Id"

エンドポイントの相対パスは文字列なので、strUserNameを文字列に連結させてName(ロボット名)の条件にできますね!ロボットIDだけ取得したいので、&で$select文を繋げてIdとしましょう!

画像3

JSON応答を取得する変数としてstrRobotResponseを設定してあげましょう。
要領はReleaseKeyと同じで逆シリアル化し、JSONオブジェクトのvalueデータからロボットIDを取得します。
RobotIdの場合は文字列変数ではなく、リスト、liRobotIdsにRobotId(=jobjResponse("Value")(0)("Id").ToString)を入れます

画像4

今回はロボットID一つだけ取得したいので、条件分岐の内容は「取得JSONデータの個数が1つならば」としていますが、ロボットIDは複数指定してJobを開始することも可能なので、この辺りは皆さんの業務内容に合わせてループにするなりしてリストにロボットIDをを追加することをお勧めします!
さて、これで材料が揃いましたね!
ここでやっと、Jobの開始をするための作業になります!

④JobStartするための定義文であるJSONペイロードを作成してみましょう!

JSONペイロードなにそれ?ってやつですよね…
「Job実行してくださ~い!」って言っても、マナーがありますよね。

OC「えっと、まずは適切な申請書に実行したいJob情報と条件の記載おねがいしま~す!」

ってやつがJSONペイロードです
前回の記事にも書きましたが、下記の画像がその申請書みたいなものですね

画像5

人間の言葉に直すと…

画像6

さて、JSONペイロードの書き方なのですが、アクティビティのプロパティを見てみますとString型なんですね

画像7

このJSONペイロードの作り方、実は実行先のプロセスに引数渡したり、ロボットの指定がない場合はとっても簡単で、画像にあるペイロードをPostmanからお手元のメモ帳にコピペし、ダブルクオテーションを削除し一列にならべます。値が入るところはシングルクオテーションにしましょう。両端をダブルクオテーションで囲んだら、本アクティビティのプロパティのJSONペイロードに入力するだけでOK!

"{startInfo: {ReleaseKey: '"+strReleaseResponse+"',Strategy: 'Specific',RobotIds: ["+liRobotIds(0)+"],Source: 'Manual',JobPriority: 'Normal'}}"

ただ、ここで問題なのが引数がある場合複数ロボットがある場合の文字列の作り方なんですよね…。下記は引数がある場合のJSONペイロード例です。(モダンフォルダの場合のペイロード例で、すみません)

引数一個の場合

画像8

引数が複数の場合(すみません、Postmanの画像が収まりきらなかったので…、メモ帳にコピペしたやつになります)

画像9

これを、API×ロボット連携やるぞー!って意気込んでいた当時…

これを見て…「このInputArgumentsの値内のバックスラッシュは?」「InputArguments内の引数名を表すダブルクオテーションは必要なの?!」「値もバックスラッシュついてますけど?!」「値の文字列表すダブルクオテーションは?!」「複数引数且つ、引数の値が配列/リストとかだったら…?!」

と疑問が盛りだくさんなんでした…

試行錯誤して一文の文字列でペイロード作ってもエラーの連発で、単に一列の文字列にしちゃえというわけでもなかったのですよね…

これは絶対同じ悩みを抱えている人がいるはず!!!とForumを検索


そして居た!!! 

からの…外国の方=英語!!
何やかんやのやり取りで、やっぱりJSONファイルを用意しないとダメなのかな…なんて涙目で諦めていたら、質問者のFelixさん何気に独自でエラー吐かない一文を作りあげ解決してたので(Forumの下方)、さっそく使わせてもらったら…

私の方ではエラーが出てしまった…orz

もうね、当時、泣きそうでしたよ…

でも、そんなFelixさんに返信している救世主がおりました!

その名はCristianさん!!!

そうなんです、私以前ねSalesforceとロボット連携する際も、Salesforceのアクティビティの使い方がイマイチ分からず、そのアクティビティを作成したCristianさんの動画をヘビーに視聴して大変お世話になっていたんですよ…。
Forward前あたりかな?来日されたこともあり、遠目で「あ…Cristianさんだ…」と柱から覗いていたほどです…

画像15


API関連でいえば、この人です…そして、返信に書かれていたYoutube動画を早速みました!そして、成功したんですね~

代入アクティビティに文字列変数strJSONPayLoadを左辺に作ります
右辺の内容はこんな感じです。

JObject.FromObject(New With{ 
Key.startInfo=New With{
Key.ReleaseKey= strReleaseResponse,
Key.Strategy="Specific",
Key.RobotIds= liRobotIds,
Key.Source="Manual",
Key.JobPriority="Normal",
Key.InputArgument="{"+Chr(34)+"intDate"+Chr(34)+":"+Now.Day.ToString+"}"
}
}).ToString()

長い…ですが、これで上手くエラー吐かなかったのです…
JObject.FromObject().ToStringは呪文と思ってください。
この()内にJSONペイロード内容を書き込みます。
JSONペイロード画像でいう{}でくくられている箇所の始まりの{の前にNew Withという呪文を入れます。そして、各種の条件項目はKey.と頭にくっつけ、値は=で結んであげます。各項目はカンマで区切りましょう!
そうするとRobotIdもリストのまま=の左側に変数名を指定してあげるだけです。問題のInputAgumentも=の左側にダブルクオテーションで囲った{}を設定し、その{}の中にダブルクオテーションを意味するASCIIキーChr(34)を入れ、引数名を文字列で入れ、Chr(34)でくくってあげます。再び:を文字列でいれ、本日の日にちを文字列で連結してあげます。
New Withの数だけ}}で閉じたら、)の外をToString関数で文字列にしてあげます。

⑤JobStartしてみましょう!

こうして作ったJSONペイロードを持つstrJSONPayLoadをアクティビティに入力します

画像10

エンドポイント早退パスはポストマンに記載されているパスのOdataから始まる箇所から末尾までを文字列に設定します

画像11

なので、文字列は

”/odata/Jobs/UiPath.Server.Configuration.OData.StartJobs”

となります。
メソッドをPostに設定しましょう

画像12

結果が取得した場合はJSON応答かStatusコードに変数を設定してあげるだけです。

Process2側の実装内容はMain.xamlの引数に入力引数intDateを作ってあげます。そうですね…ログかメッセージボックスを実装し、このintDateを表示するシンプルなものでも良いかと思います。

Processs1を開発する前にProcess2を開発・OCへパブリッシュ+Processと紐づけまでしちゃってください。あとはProcess1をOCへパブリッシュ+Process/Robotとづけしたら、Process1を実行するのみです!


取り急ぎ、こんな風なワークフローになるかなと思います

おそ松さまでした!

以上!Orchestratorへhttpリクエストを要求アクティビティについてです!




この記事が気に入ったらサポートをしてみませんか?