Использование действия "Вызов веб-службы HTTP" (Call HTTP Web Service) при работе с веб-службой
Дата публикации исходной статьи: среда, 05 сентября 2012 г.
Всем привет, меня зовут Ён Гук Ким, я работаю старшим руководителем программы в команде разработчиков SharePoint.
В этой статье я хотел бы обсудить разработку рабочих процессов SharePoint 2013, использующих общедоступную или коммерческую веб-службу HTTP (REST). Кроме того, я расскажу, как использовать этот рабочий процесс в качестве службы для ежедневной рассылки сообщений.
В следующем ролике мы создали рабочий процесс сайта под названием "Ежедневные предложения eBay" (eBay Daily Deals), который считывает данные по ежедневным предложениями с сайта eBayTM, создает элементы предложений в списке рекламных ссылок SharePoint, после чего отправляет сообщения электронной почты пользователям, подписавшимся на эту рассылку.
Использование действия "Вызов веб-службы HTTP" (Call HTTP Web Service) при работе с веб-службой
"Ежедневные предложения eBay" (eBay Daily Deals) — это рабочий процесс сайта. Соответственно, в первую очередь нам необходимо создать новый рабочий процесс сайта SharePoint 2013. После этого требуется добавить три стадии, присвоить им нужные имена и связать с помощью действий перехода Go To.
Стадия 1
Стадия 1 будет иметь имя "Получение ежедневных предложений eBay" (Get eBay Daily Deals) и будет содержать четыре действия в одном блоке цикла Loop (см. рис. 1).
Рис. 1. Стадия 1 рабочего процесса
В первую очередь мы добавляем действие "Вызов веб-службы HTTP" Call HTTP Web Service. В качестве URI HTTP используется адрес https://www.firstamong.com/json/index.php?q=https://deals.ebay.com/feeds/xml, а в качестве метода HTTP — "GET". Конечно, было бы удобнее использовать одну из веб-служб REST eBay, которые возвращают объект JSON, однако из-за неудобного заголовка в выходных данных веб-службы REST eBay нам приходится использовать дополнительную веб-службу преобразования (доступно несколько таких служб). В нашем случае используется служба www.firstamong.com), которая вызывает другую веб-службу REST eBay, возвращающую XML-код и "чистые" объекты JSON.
В выражении действия "Вызов веб-службы HTTP" (Call HTTP Web Service) за ненадобностью не выполняется отправка параметра RequestContent или RequestHeaders. Нам интересны исключительно выходные данные этой службы. Просто присвоив параметр response переменной ResponseContent, мы можем сохранить выходные данные этой веб-службы в переменной типа словаря ResponseContent.
Выходной объект JSON веб-службы преобразования, которую вызывает веб-служба XML eBay, выглядит следующим образом:
{"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 элемента. Чтобы наглядно и в более удобной форме продемонстрировать структуру элементов предложений в выходных данных веб-службы, я использую для доступа к свойствам элемента полный путь. Например, выражение вида "Get EbayDailyDeals/Item([%Variable: Index%])/Title from Variable: ResponseContent" (а не Variable: DealItems) позволяет извлечь свойство Title элемента. Дополнительные сведения об использовании типа словаря см. по ссылкам, приведенным в конце этой статьи.
На рис. 2 демонстрируется извлечение различных свойств внутренних элементов.
Рис 2. Извлечение свойств элементов предложений и создание рекламных ссылок
С помощью действия "Получение элемента из словаря" (Get item from Dictionary) мы сохраняем каждое свойство каждого элемента предложения в переменной рабочего процесса и после этого используем их при создании элемента списка в следующей части блока цикла Loop. Большинство переменных, используемых в процессе извлечения, имеют тип string, однако в некоторых случаях применяются переменные других типов.
Дополнительные сведения об использовании типа словаря см. по ссылкам, приведенным в конце этой статьи.
Рис. 3. Локальные переменные
Кроме того, мы используем действие "Замена строки" (Replace String), позволяющее обойти ограничение SharePoint, из-за которого мы не можем использовать в данных типа URL знаки "," и "!".
В конце блока цикла Loop определены два блока шагов Step, в которых мы формируем содержимое сообщения электронной почты и увеличиваем переменную индекса на единицу. Этот рабочий процесс используется в двух основных сценариях: создание элементов списка на основании выходных данных веб-службы eBay и отправка сообщений пользователям, подписавшимся на рассылку данных процесса "Ежедневные предложения eBay" (eBay Daily Deals). Фактически, мы создаем фрагмент HTML внутри блока цикла Loop (см. рис. 4).
Рис. 4. Два шага в блоке цикла Loop
Вы можете видеть, что переменные рабочего процесса, которые мы использовали для создания элементов списка, повторно используются при построении фрагмента HTML (см. рис. 5).
Рис 5. Построение фрагмента HTML для текста сообщения электронной почты
Стадия 2
На стадии 2 используется та же логика рабочего процесса, что и на стадии 1. Единственное отличие заключается в выражении вызова веб-службы, которое применяется на стадии 1 (см. обведенное выражение на рис. 6). В принципе, для создания стадии 2 достаточно скопировать и вставить содержимое из первой стадии.
На стадии 2 из выходных данных веб-службы "Ежедневные предложения eBay" (eBay Daily Deals) считывается дополнительный раздел. Соответственно, мы можем использовать ту же логику и указать другой путь для извлечения массива Item из приведенного выше выходного объекта JSON.
Рис. 6. Стадия 2 рабочего процесса
Это значит, что для доступа к элементам раздела "MoreDealsSection" нам необходимо использовать другой путь (см. рис. 7).
Рис. 7. Получение подробных сведений о предложении из раздела MoreDealsSection
В остальном эта стадия реализуется абсолютно так же.
Стадия 3
На стадиях 1 и 2 мы создали элементы списка и построили фрагменты HTML, которые впоследствии будут использоваться для отправки сообщений электронной почты. Стадия 3 реализует процедуру отправки и, соответственно, содержит только одно действие "Отправка сообщения" (Send Email) (см. рис. 8). В качестве получателей выступают пользователи группы SharePoint, которая содержит всех участников сайта, подписавшихся на сообщения о ежедневных предложениях.
Рис. 8. Стадия 3 рабочего процесса
Текст сообщения электронной почты в формате HTML можно ввести в диалоговом окне таблицы свойств для действия "Отправка сообщения" (Send Email), как показано ниже. Поскольку в переменной EmailContent уже хранится фрагмент кода таблицы HTML, нам достаточно заключить подставленную переменную в теги (см. рис. 9).
Рис. 9. Построение полного текста сообщения электронной почты
Вот и все! Теперь вы можете опубликовать полученный рабочий процесс и выполнить его.
Убедитесь, что список "Ежедневные предложения eBay" (eBay Daily Deals) добавлен на сайт и имеет тип "Рекламные ссылки" (Promoted Links), который был впервые представлен в SharePoint 2013. Чтобы найти это приложение списка, щелкните ссылку "Параметр" (Settings) в верхнем правом углу домашней страницы сайта и выберите команду "Добавить приложение" (Add an app).
Запуск рабочего процесса
При запуске этого рабочего процесса в списке "Ежедневные предложения eBay" (eBay Daily Deals) автоматически создаются элементы предложений, после чего рассылаются сообщения электронной почты.
Рис. 10. Список рекламных ссылок "Ежедневные предложения eBay" (eBay Daily Deals)
Рис. 11. Сообщение, отправленное из рабочего процесса
Повтор цикла
Мы с вами построили очень полезный рабочий процесс, который рассылает сообщения электронной почты с данными по ежедневным предложениям eBay. Однако часто требуется организовать регулярную, например, ежедневную рассылку сообщений. Возможно ли это?
Конечно! Ниже показано, как реализовать ежедневное извлечение предложений eBay и рассылку соответствующих сообщений. Для этого необходимо добавить действие "Приостановка на время" (Pause for Duration) и изменить целевой объект выражения перехода Go To на стадии 3, задав обратную ссылку на стадию 1.
Звучит привлекательно, не так ли?
Рис. 12. Возврат к началу цикла
Ссылки
В этом разделе приводятся ссылки на статьи, содержащие дополнительные сведения и действиях типа словаря и рабочего процесса, которые применяются для обработки переменных словаря и веб-служб HTTP.
Содержимое справки SharePoint Designer 2013
- MSDN. Общие сведения о действиях словаря в SharePoint Designer 2013
- MSDN. Вызов веб-службы HTTP с использованием словаря (эта статья пока недоступна)
Это локализованная запись блога. Исходная статья доступна по адресу How to work with web service using “Call HTTP Web Service” action