设为首页 收藏本站
查看: 936|回复: 0

[经验分享] SharePoint 2013 工作流连接Web服务/REST服务

[复制链接]

尚未签到

发表于 2015-9-24 08:36:27 | 显示全部楼层 |阅读模式
  之前在讲课的时候,介绍到SharePoint 2013工作流的时候会做一个例子——通过调用一个REST服务来获取某个城市的天气预报信息。
  其实这个例子是来自SPC(SharePoint Conference) 2012的,在此整理一下。
  
  首先简单的回顾一下SharePoint和工作流的历史:
  在SharePoint 2007之前,SharePoint本身只能借助一些第三方产品实现一些工作流的应用;
  SharePoint从2007版本开始支持内置的工作流,这完全得益于.Net Framework 3.0中增加的Workflow Foundation;
  2010的时候,因为整个SharePoint没有赶上.Net 4.0的发布,还是3.5版本(本质上和3.0没什么区别),所以在工作流这个功能中并没有太突出的改进。
  SharePoint 2007 / 2010中的工作流,根据WF 3.0的特点,分为顺序工作流和状态机工作流两种;开发工具分为SPD(SharePoint Designer)和VS(Visual Studio),当然更严格一点划分的话,2010中从内置工作流到VS开发工作流可以分成5个不同的层面(完全是用内置工作流、用SPD修改内置工作流、使用SPD工作流、使用SPD工作流+自定义开发的Activity、使用VS开发工作流)。其中SPD作为一个无代码开发工具,可以作一些简单流程(虽然是无代码,但是其实这个设计过程相当于伪代码编写,还是需要一定的编程思想——至少你要知道什么叫变量),但是其最大的几个弊端:只支持顺序工作流不支持跳转、不支持循环、不支持访问外部数据或者服务,从而极大地限制了SPD工作流的应用场景。而VS工作流虽然功能比较强大,但开发起来却又非常繁琐(一个完整的任务都要分成3个Activity来实现),尤其是VS工作流 + InfoPath表单的时候。
  另外,根据SharePoint 2007 / 2010的设计,工作流是宿主在SharePoint本身的进程(也就是IIS的进程)去完成的,所以一旦流程并发量很大的时候,对SharePoint的服务器性能也会造成一定的依赖甚至影响。
  所以可以说,在SharePoint 2010及其之前的时代,工作流一直是整个产品的一个短板,因此也就催生了无数第三方的SharePoint工作流产品,包括国外鼎鼎有名的诸如K2、Nintex这样的产品,也有国内的一些产品(国内某产品完全是Nintex的Copycat,还很喜欢在各种地方留下自己的名字),也有如QuickFlow这样面向开发人员的开发工具。不过从我们做项目的经验来看,不论什么样的产品,在做实际应用的时候,多多少少都会碰到一些坑,需要自己编写一些辅助的周边支持代码,才能满足用户的需求(或者就是用户退而求其次,接受产品的默认性质——这在国内用户中比较少见)。
  
  到了SharePoint 2013的时候,由于依附于.Net Framework 4.5,因此工作流层面也有了非常大的改进:
  首先,SharePoint 2013为了兼容以前升级过来的系统,依然支持传统模式的工作流(WF 3.0 模式的),其功能和运行原理完全和2010保持一致性。
  其次,2013提供了全新的一套工作流框架,可以完全独立于SharePoint服务器安装,也就意味着如果需要使用2013额外的工作流功能的话,需要单独安装一套工作流的服务器端 / 客户端产品,具体的安装过程可以参考 kaneboy的这篇博客:SharePoint 2013 App 开发 (2) - 建立开发环境。
  在这套全新的工作流引擎中,工作流不在宿主于SharePoint进程运行(包括工作流所涉及到的数据库也独立于SharePoint数据库),而是使用了如下图所示的一套框架:
DSC0000.png
  流程引擎和SharePoint之间,完全通过REST调用和事件驱动来实现数据的交互。
  在能力上,之前SharePoint Designer工作流的三大短板:跳转、循环、调用外部数据/服务,在这套框架下都得到了支持。
  在这套新的框架下,2013工作流本质上利用了WF 4的Flow Chart,实现了一个状态机的方式,同样可以在Visio中进行流程设计:
DSC0001.png
  (图中的蓝方块就是一个个“状态”,可以根据不同的条件进行跳转)。
  另外,SharePoint Designer中也支持了两种循环模式:循环N次,或者指定条件循环。
  
  当然,本文的重点还是放在第三项,对外部服务调用的支持。
  首先看看一下那个天气预报的服务,这个服务来自http://free.worldweatheronline.com 这个网站,如果需要调用它的服务的话,需要注册一个账号,并免费获取一个API Key。
  调用的形式类似:http://free.worldweatheronline.com/feed/weather.ashx?q=Seattle&format=json&num_of_days=1&key=xxxx
  所有的参数都通过Url传递,其中q=Seattle,表示查询西雅图的天气;format=json表示返回json格式的数据结果;num_of_days=1表示要获取1天的天气预报;key=xxx就是我们注册后获取的那个API Key。
  返回结果类似如下结构:
DSC0002.png
  (这是软件一个JSON查看器,来自http://jsonviewer.codeplex.com/ )
  那个例子所做的功能,就是建立一个列表,让用户输入一个城市名称,然后启动工作流去调用这个服务,传入城市名称,得到返回的结果,并填入列表的其他字段中。
  这个列表很简单,只包括下面这几个字段(我是在Office 365上做这个Demo的,懒得切换成中文,大家将就看吧):
DSC0003.png
  然后启动SPD,打开这个网站,新建一个列表工作流:
DSC0004.png
  可以看到,在平台类型中,默认会选中“SharePoint 2013 工作流”;如果我们是在On-Premise的环境中使用,如果你的环境中正确安装配置了那套新的工作流平台的话,会看到这个选项,否则的话,只有传统的“SharePoint 2010 工作流”。
  SPD 2013的基本界面和2010是一致的,我们现在需要做的,就是调用那个Web服务,这时候会用到SPD 2013新提供的一个Activity:调用HTTP Web服务:
DSC0005.png
  插入之后,有如下一些选项:
DSC0006.png
  其中“this”那个地方我们填入Web服务的地址,使用HTTP GET方法,并用列表中的“城市”字段,作为Url中的q参数:
DSC0007.png
  由于这个Web服务是一个非常简单的GET形式的REST协议,除了Url参数外,我们不需要在header或者body传递任何额外的数据,因此那个“request”我们不需要进行设置;获取的时候,因为只是一个Demo,也不需要获取Response Code(比如200表示调用成功之类的)或者Response Header,而只需要得到Response的内容,因此,我们只针对Response本身创建一个变量:
DSC0008.png
DSC0009.png
  我们之前已经看到了,这个服务的返回结果是一个复杂的JSON,其中包含多层属性、数组等内容,此时,我们就需要用到2013全新增加的“字典(Dictionary)”这样一个变量类型——专门用于描述这种复杂的数据结构。
  接下来的事情,就是从整个结果中抽取单独的结果并保存在列表条目的字段中。如何从一个复杂结果中抽取一个值呢?我们需要用到2013另一个新的Activity:Get an item from a dictionary(从字典中获取值):
DSC00010.png
  其中最主要的就是路径,它指明了如何从一个复杂的数据结构中获取某一个值,对于比如“最高温”而言,这个路径是“data/weather(0)/tempMaxC”——如果你去看一下之前某张图中的JSON数据结构的话,就很容易理解这个是怎么来的了。
  当然,这个Activity只能把结果存到一个变量中,因此我们可以新建一个变量来保存它:
DSC00011.png
  SPD 2013的另外一个好处,就是支持复制粘贴,因此我们只需要简单的选中并复制一下这个操作,多粘贴几次,进行简单地修改,就能够得到:
DSC00012.png
  随后,把这些变量都更新到当前列表条目中即可(天气图片是个多行文本,我们需要把图片的Url地址加工一下):
DSC00013.png
  之前说过,SPD 2013默认是一种类似状态机的工作流,所以最后别往了把状态跳转到“结束”:
DSC00014.png
  
  当然,我们可以把工作流设置为“新建时自动启动”——这个和2007 / 2010都一样,最后的效果:
DSC00015.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-117936-1-1.html 上篇帖子: [SharePoint 2010]在SharePoint中几种访问域用户profile的方法 下篇帖子: Sharepoint学习笔记—Site Definition系列-- 2、创建Content Type
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表