"HTTP Web サービス" アクションを使用して Web サービスを操作する方法
原文の記事の投稿日: 2012 年 9 月 5 日 (水曜日)
こんにちは。SharePoint Designer チームのシニア プログラム マネージャーの HyongGuk Kim です。
このブログでは、パブリックまたはコマーシャル HTTP (REST) Web サービスを使用する SharePoint 2013 ワークフローを記述し、そのワークフローを、ルーピングによって電子メールを毎日送信するサービスとして実行する方法について説明します。
以下のビデオ クリップで説明するように、ここでは "eBay デイリー ディール" (eBay Daily Deals) という名前のサイト ワークフローを作成します。このワークフローでは、eBayTM からデイリー ディール情報を読み取り、SharePoint プロモーション リンク (SharePoint Promoted Links) リストで取り引きアイテムを作成し、その取り引き情報の受信を希望しているユーザーに電子メールを送ります。
HTTP Web サービス アクションを使用して Web サービスを操作する
"eBay デイリー ディール" (eBay Daily Deals) ワークフローはサイト ワークフローなので、最初に新しい SharePoint 2013 サイト ワークフローを作成する必要があります。サイト ワークフローを作成したら、あとは 3 つのステージを追加し、それぞれに適切な名前を付けて、Go To アクションを使ってリンクを設定するだけです。
ステージ 1
[ステージ: 1. eBay デイリー ディールを取得する] (Stage: 1. Get eBay Daily Deals) に名前を付け、図 1 に示すように、4 つのアクションと 1 つのループ ブロックを追加します。
図 1. ワークフロー ステージ 1
最初に追加したのは、Call HTTP Web Service アクションです。HTTP URI は https://www.firstamong.com/json/index.php?q=https://deals.ebay.com/feeds/xml (英語) に、HTTP メソッド は "GET" に設定されています。本来なら JSON を返す eBay の REST Web サービスの 1 つを使用するだけでよかったのですが、eBay REST Web サービス結果内の厄介なヘッダーのせいで、追加のトランスフォーマー Web サービスを使用しなければなりませんでした (2 つのトランスフォーマー サービスが使用できることに注意してください。ここでは、www.firstamong.com (英語) のサービスを使用しました)。この追加のサービスが、XML を返す eBay の他の REST Web サービスを呼び出して、クリーンな JSON オブジェクトを Microsoft に返します。
"Call HTTP Web Service" アクション ステートメントでは、RequestContent または RequestHeaders パラメーターは不要なので設定しません。興味があるのは、その Web サービスの出力だけです。response パラメーターを変数 ResponseContent に設定するだけで、この Web サービス呼び出しの出力は、辞書型変数 ResponseContent に格納されます。
eBay の XML Web サービスを呼び出したトランスフォーマー Web サービス JSON 出力は次のようになります。
{"EbayDailyDeals":
{"Item":[
{"ItemId":"221065015062","EndTime":"1341845999000","PictureURL":"http:\/\/i.ebayimg.com\/00\/s\/NDI4WDUxMA==\/$(KGrHqJHJBwE8+9eOVMzBPZ1lhNt!g~~60_1.JPG","SmallPictureURL":"http:\/\/i.ebayimg.com\/00\/s\/NDI4WDUxMA==\/$(KGrHqJHJBwE8+9eOVMzBPZ1lhNt!g~~60_1.JPG","Picture175Url":"http:\/\/i.ebayimg.com\/00\/s\/NDI4WDUxMA==\/$(KGrHqJHJBwE8+9eOVMzBPZ1lhNt!g~~60_1.JPG","Title":"Acer ICONIA 7in Tablet 8GB WiFi","Description":"N\/A","DealURL":"http:\/\/deals.ebay.com\/5000101083_Acer_ICONIA_7in _Tablet_8GB_WiFi","ConvertedCurrentPrice":"139.99","PrimaryCategoryName":"Computers\/Tablets & Networking:iPads, Tablets & eBook Readers","PrimaryCategoryId":"171485","Location":"Miami, Florida","Quantity":"128","QuantitySold":"372","MSRP":"299.99","SavingsRate":"53%","AutoPay":"true","Hot":"false","Tier":"0","PriceDisplay":"MSRP"},
{"ItemId":"271012700385","EndTime":"1341845999000","PictureURL":"http:\/\/i.ebayimg.com\/00\/s\/MzYwWDM2MA==\/$(KGrHqR,!ioE-w!y!T--BPto5nEk0!~~60_1.JPG","SmallPictureURL":"http:\/\/i.ebayimg.com\/00\/s\/MzYwWDM2MA==\/$(KGrHqR,!ioE-w!y!T--BPto5nEk0!~~60_1.JPG","Picture175Url":"http:\/\/i.ebayimg.com\/00\/s\/MzYwWDM2MA==\/$(KGrHqR,!ioE-w!y!T--BPto5nEk0!~~60_1.JPG","Title":"Sylvania Wireless CE 7-Inch Smartbook - SYNET7WIC","Description":"N\/A","DealURL":"http:\/\/deals.ebay.com\/5000101099_Sylvania_Wireless_CE_7_Inch_Smartbook___SYNET7WIC","ConvertedCurrentPrice":"49.99","PrimaryCategoryName":"Computers\/Tablets & Networking:Laptops & Netbooks:PC Laptops & Netbooks","PrimaryCategoryId":"177","Location":"US","Quantity":"1307","QuantitySold":"693","MSRP":"199.99","SavingsRate":"75%","AutoPay":"true","Hot":"false","Tier":"0","PriceDisplay":"MSRP"},
{"ItemId":"160823596564","EndTime":"1341845999000","PictureURL":"http:\/\/i.ebayimg.com\/00\/s\/NjAwWDM1MQ==\/$(KGrHqFHJFQE+T-
...
"MoreDeals":
{"MoreDealsSection":[
{"SectionTitle":"Emergency Preparedness","Item":[
{"ItemId":"200687021159","EndTime":"1341845999000","PictureURL":"http:\/\/i.ebayimg.com\/00\/s\/NDI5WDUwMA==\/$(KGrHqV,!p0E-vF(Fmt0BP7iH6)M6g~~60_1.JPG","SmallPictureURL":"http:\/\/thumbs4.ebaystatic.com\/pict\/200687021159_1.jpg","Picture175Url":"http:\/\/thumbs4.ebaystatic.com\/pict\/200687021159_1.jpg","Title":"DuroMax 1500 Watt Portable Pull Start Gas Power Job Site Electric Generator","Description":"NA","DealURL":"http:\/\/deals.ebay.com\/5000099668_DuroMax_1500_Watt_Portable_Pull_Start_Gas_Power_Job_Site_Electric_Generator","ConvertedCurrentPrice":"179.99","PrimaryCategoryName":"Home & Garden:Tools:Generators: Home-Use","PrimaryCategoryId":"46412","Location":"La Verne","Quantity":"302","QuantitySold":"228","MSRP":"299.99","SavingsRate":"40%","AutoPay":"true","Hot":"false","Tier":"0","PriceDisplay":"MSRP"},
{"ItemId":"370622857968","EndTime":"1341845999000","PictureURL":"http:\/\/i.ebayimg.com\/00\/s\/MTAwMFgxMDAw\/$T2eC16h,!)0E9s37IeSMBP7IWFtFqw~~60_12.JPG","SmallPictureURL":"http:\/\/thumbs1.ebaystatic.com\/pict\/370622857968_1.jpg","Picture175Url":"http:\/\/thumbs1.ebaystatic.com\/pict\/370622857968_1.jpg","Title":"Dorcy High Beam LED Aluminum Flashlight 100 Lumens Water Resistant 41-4287","Description":"NA","DealURL":"http:\/\/deals.ebay.com\/5000099680_Dorcy_High_Beam_LED_Aluminum_Flashlight_100_Lumens_Water_Resistant_41_4287","ConvertedCurrentPrice":"11.99","PrimaryCategoryName":"Sporting Goods:Outdoor Sports:Camping & Hiking:Flashlights, Lanterns & Lights:Flashlights","PrimaryCategoryId":"16037","Location":"Altatac USA","Quantity":"1899","QuantitySold":"1113","MSRP":"49.99","SavingsRate":"76%","AutoPay":"false","Hot":"false","Tier":"0","PriceDisplay":"MSRP"},
{"ItemId":"300725740900","EndTime":"1341845999000","PictureURL":"http:\/\/i.ebayimg.com\/00\/s\/NTAwWDUwMA==\/
...
実は、内部アイテムを処理する目的で DealItems 変数を使用し、"Get ([%Variable: Index%])/Title from Variable: DealItems" のようなアクション ステートメントを挿入して、アイテムの Title プロパティを取得することはできました。しかし、できるだけ簡単に説明できるように、また、サービス出力内の取り引きアイテムの構造を明確に示すために、アイテムのプロパティへのアクセス パスとして完全パスを入力しました。したがって、"Get EbayDailyDeals/Item([%Variable: Index%])/Title from Variable: ResponseContent" (Variable: DealItems ではありません) が、アイテムの Title プロパティを取得します。辞書型の使用の詳細については、このブログの最後にあるリンクを参照してください。
図 2 は、各内部アイテムの各種プロパティすべてを取得する方法を示しています。
図 2. 取り引きアイテムのプロパティを取得し、プロモーション リンク アイテムを作成
Get item from Dictionary アクションで、各取り引きアイテムのすべてのプロパティをワークフロー変数に格納し、そのプロパティを使用して、ループ ブロックの後半部分でリスト アイテムを作成します。この "取得" プロセスで使用している変数のほとんどが string 型ですが、他の型が使用されていることもわかります。
辞書型の使用の詳細については、このブログの最後にあるリンクを参照してください。
図 3. ローカル変数
また、Replace String アクションを使用し、URL 型のデータで ',' または '!' 文字を使えないという制限に対処します。
ループ ブロックの末尾には、2 つのステップ ブロックがあります。ここでは、電子メールのコンテンツを作成し、インデックス変数を 1 ずつインクリメントします。このワークフローの 2 つのメインのシナリオは、eBay Web サービスの結果を使用してリスト アイテムを作成し、"eBay デイリー ディール" 情報の受信を希望しているユーザーに電子メールを送ることです。そこで、図 4 に示すように、ループ ブロック内で HTML フラグメントを作成します。
図 4. ループ ブロックの 2 つのステップ
図 5 を見ると、リスト アイテムを作成する際に使用したワークフロー変数すべてが、HTML フラグメントを作成するときに再利用されていることがわかります。
図 5. 電子メール本文の HTML フラグメントの作成
ステージ 2
ステージ 2 のワークフロー ロジックは、ステージ 1 の Web サービスを呼び出す 1 つのステートメント (図 6 でマークが付いたステートメントを参照) を除き、ステージ 1 のものとまったく同じです 。つまり、ステージ 2 は、ステージ 1 のコンテンツをステージ 2 にコピーして貼り付けるだけで簡単に作成できます。
ステージ 2 では、eBay デイリー ディール Web サービスの出力内で追加セクションを読み取ります。したがって、同じロジックを使用できますが、上記の大きな JSON 出力から Item 配列を取得する場合は、異なるパスを使用します。
図 6. ワークフロー ステージ 2
また、これは、図 7 で示すように、"MoreDealsSection" のアイテムにアクセスする場合は別のパスを使用する必要があることを意味します。
図 7. MoreDealsSection で追加の取り引きアイテムを取得
その他についてはすべて、まったく同じです。
ステージ 3
ステージ 1 とステージ 2 では、リスト アイテムと、後で電子メールを送信するときに使用する HTML フラグメントを作成しました。ステージ 3 は、電子メールを送信する場所なので、図 8 で示すように、1 つのアクション Send Email のみが含まれます。"サブスクライバー" (Subscribers) は、デイリー ディールの電子メールの受信を希望しているすべてのサイト メンバーがメンバーとして追加される SharePoint グループです。
図 8. ワークフロー ステージ 3
以下に示すように、Send Email アクションのプロパティ グリッド ダイアログで、HTML 形式の完全な電子メール本文を作成できます。変数 EmailContent には複雑な HTML 表コード フラグメントが既にあるので、後はその変数ルックアップを囲むラッパー タグをいくつか挿入するだけです (図 9 を参照)。
図 9. 完全な電子メール本文の作成
これで終わりです。このワークフローを発行して開始する準備が完全に整いました。
"eBay デイリー ディール" リストがサイトにあることと、それが SharePoint 2013 の便利なリストの種類 "プロモーション リンク" であることを確認します。このリスト アプリは、サイト ルート ページの右上隅にある [ 設定 ] (Settings) リンクの [ アプリの追加 ] (Add an app) をクリックすれば、簡単に見つけることができます。
ワークフローを開始する
このワークフローを開始すると、"eBay デイリー ディール" リストに eBay デイリー ディールのアイテムが作成されるのがわかります。また、ワークフローから電子メールが送信されることも確認できます。
図 10. eBay デイリー ディールのプロモーション リンク リスト
図 11. ワークフローから送信された電子メール
ループ バックとは
eBay デイリー ディール情報を電子メールで送信する優れたサイト ワークフローを作成する方法については確認しました。それでは、電子メールを "毎日" 受け取りたいとしたらどうでしょう。このワークフローを、24 時間ごとに繰り返し実行することはできるのでしょうか。
もちろん、できます。以下に示すように、Pause for Duration アクションを追加し、ステージ 3 の Go To ステートメントの対象を変更し、移動先としてステージ 1 を指定すると、このワークフローは、毎日 eBay デイリー ディールのアイテムを取得し、これらの取り引きを電子メールで送信するサービスのように動作します。
面白いですよね。
図 12. 最初にループ バック
参考資料
辞書変数および HTTP Web サービスを処理する辞書型およびワークフロー アクションの詳細については、以下の資料を参照してください。
SharePoint Designer 2013 ヘルプ コンテンツ
- MSDN: Understanding Dictionary actions in SharePoint Designer 2013 (英語)
- MSDN: Calling HTTP web service with Dictionary (このコンテンツはまだ利用できません)
これはローカライズされたブログ投稿です。原文の記事は、「How to work with web service using "Call HTTP Web Service" action」をご覧ください。