如何通过“Call HTTP Web Service”操作使用 Web 服务

原文发布于 2012 年 9 月 5 日(星期三)

图像

大家好,我是 HyongGuk Kim,SharePoint Designer 团队的一名高级项目经理。

在本文中,我将要介绍如何轻松编写使用公共或商业 HTTP (REST) Web 服务的 SharePoint 2013 工作流,以及如何简单地通过循环将其作为发送日常电子邮件的服务运行。

正如您在下面的视频剪辑中看到的,我们将构建一个名为“eBay Daily Deals”的网站工作流,该工作流从 eBayTM 读取日常交易信息,在 SharePoint“已升级的链接”列表中创建交易项目,然后将电子邮件发送给想要接收此交易信息的人员。

通过“Call HTTP Web Service”操作使用 Web 服务

 

由于“eBay Daily Deals”工作流是一个网站工作流,因此您必须做的第一件事情就是创建一个新的 SharePoint 2013 网站工作流。创建好网站工作流后,只需添加三个阶段,正确为其命名,然后使用“转至”操作链接它们即可。

 

 

阶段 1

将阶段 1 命名为“Get eBay Daily Deals”,然后添加四个操作和一个循环块,如图 1 所示。

clip_image002

图 1. 工作流阶段 1

 

我们添加的第一个操作是 Call HTTP Web Service 操作。HTTP URI 设置为 https://www.firstamong.com/json/index.php?q=https://deals.ebay.com/feeds/xml(该链接可能指向英文页面)HTTP 方法 设置为“GET”。最好只使用一个 eBay 的 REST Web 服务来返回 JSON,但由于 eBay REST Web 服务输出的标头很麻烦,所以我们不得不使用一个额外的转换器 Web 服务(请注意,有多个转换器服务可用。在我们的例子中,使用了来自 www.firstamong.com(该链接可能指向英文页面)的服务),它调用 eBay 的另一个 REST Web 服务来向我们返回 XML 和经过清理的 JSON 对象。

在“Call HTTP Web Service”操作语句中,我们不设置 RequestContentRequestHeaders 参数,因为不需要。我们仅对该 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 属性。但是,仅仅为了让事情简单化并展示 Web 服务输出中清晰的交易项目结构,我使用完整路径访问项目的属性。所以采用诸如“Get EbayDailyDeals/Item([%Variable: Index%])/Title from Variable: ResponseContent”(而非 Variable: DealItems)的语句检索项目的 Title 属性。有关使用字典类型的详细信息,请访问本博客末尾提供的链接。

 

图 2 显示我们如何检索每个内部项目的所有不同属性。

clip_image003

图 2. 检索交易项目的属性并创建升级链接项目

 

使用 Get item from Dictionary 操作,我们将每个交易项目的所有属性存储在工作流变量中,然后当我们在稍后的循环块部分创建列表项目时使用它们。我们在此“检索”过程中使用的大部分变量类型都为 string 类型,但是您可以注意到,我们也使用了其他类型。

有关使用字典类型的详细信息,请访问本博客末尾提供的链接。

clip_image004

图 3. 局部变量

 

我们还使用 Replace String 操作解决不能在 URL 类型数据中使用“,”或“!”字符的 SharePoint 限制。

 

在循环块末尾,有两个步骤块,我们在其中构建了电子邮件内容并将索引变量递增一个单位。此工作流的两个主要应用场景是使用 eBay Web 服务的输出创建列表项目,然后通过电子邮件发送给希望接收“eBay Daily Deals”信息的人员。为此,我们在循环块内部构建了 HTML 片段,如图 4 所示。

clip_image005

图 4. 循环块中的两个步骤

 

您可以看到我们用于创建列表项目的工作流变量全部又重复用于构建 HTML 片段,如 5 所示。

clip_image006

图 5. 构建电子邮件正文的 HTML 片段

 

 

阶段 2

阶段 2 中的工作流逻辑与阶段 1 中的工作流逻辑完全相同,只是多了一个用于调用阶段 1 中 Web 服务的语句(请参阅图 6 中圈起来的语句)。为此,您只需通过将阶段 1 中的内容复制和粘贴到阶段 2 中即可轻松创建阶段 2。

阶段 2 将读取 eBay 的 Daily Deals Web 服务输出中的额外部分。因此,我们在尝试从上面的大型 JSON 输出中检索 Item 数组时,可以使用相同的逻辑但使用不同的路径。

clip_image007

图 6. 工作流阶段 2

 

这意味着我们需要使用不同的路径访问“MoreDealsSection”中的项目,如图 7 所示。

clip_image008

图 7. 在 MoreDealsSection 中获取更多交易项目

 

其他所有的一切都完全一样。

 

 

阶段 3

在阶段 1 和阶段 2 中,我们创建了列表项目,还构建了 HTML 片段以便稍后发送电子邮件时使用。阶段 3 是我们发送电子邮件的阶段,因此只有一个操作,即 Send Email 操作,如图 8 所示。“订阅者”(Subscribers) 是 SharePoint 组,其中想要接收 Daily Deals 电子邮件的所有网站成员都添加为该组的成员。

clip_image009

图 8. 工作流阶段 3

 

您可以在 Send Email 操作的属性网格对话框中以 HTML 格式编写完整的电子邮件正文,如下所示。由于在变量 EmailContent 中已经具有复杂的 HTML 表代码片段,因此我们只需使用一些包装标签围住该变量查询即可,如图 9 所示。

clip_image010

图 9. 构建完整的电子邮件正文

 

就这样!您现在已经准备就绪,可以发布和启动此工作流了。

只需确保网站中具有“eBay Daily Deals”列表,并且它应该为“已升级的链接”(Promoted Links) 类型列表,这是 SharePoint 2013 中超酷的新列表类型。您可以轻松找到此列表应用程序,方法是单击网站根页面右上角的“设置”链接中的“添加应用程序”。

clip_image011

 

 

启动工作流

启动此工作流时,您会看到工作流在“eBay Daily Deals”列表中创建 eBay Daily Deal 项目,并且还会注意到电子邮件从此工作流发出。

clip_image012

图 10. eBay Daily Deals 已升级的链接列表

 

clip_image013

图 11. 从工作流发出的电子邮件

 

 

重新循环?

我们了解了如何构建良好的网站工作流,以发送含有 eBay Daily Deals 信息的电子邮件。如果我们要“每天”都接收这种电子邮件呢?是否可以让此工作流每 24 小时重复运行一次?

可以!如下所示,通过添加 Pause for Duration 操作并更改阶段 3 中 Go To 语句的目标以指回阶段 1 来实现。此工作流现在像服务一样运行,每天检索 eBay 的 Daily Deals 项目并将这些交易以电子邮件的方式发送。

很有意思,不是吗?

clip_image014

图 12. 从头开始循环

 

 

参考

以下是一些参考,您可以在其中找到有关字典类型以及处理字典变量和 HTTP Web 服务的工作流操作的详细信息。

 

SharePoint Designer 2013 帮助内容

这是一篇本地化的博客文章。请访问 How to work with web service using “Call HTTP Web Service” action 以查看原文