2016年8月30日星期二

使用Promises和HttpClient / jQuery AJAX处理SharePoint框架中的异步REST API调用

承诺调用代码

为了能够做任何有用的事情,SharePoint Framework中需要掌握的一件事是如何调用Web API(例如SharePoint)’s REST API,Office Graph或您将通过Web请求访问的任何其他REST API。显然,这些操作需要异步操作-如果您尝试以其他方式实现,’因为例如您的Web部件尝试在HTTP / AJAX调用实际返回之前进行渲染,所以会出现计时问题,因此不会显示任何数据。您以前可能曾经使用过Promises(也许是jQuery Promises),但是在SPFX中,使用的Promises Framework是 ES6的承诺 – so it’对于您的方法来说,返回这种类型的Promise而不是jQueryPromise是一个好主意。我们还必须在TypeScript中处理此问题,因此简而言之,您可能已经做过一些更改。

您最有可能使用jQuery’之前进行REST调用的AJAX方法–$ .ajax,$。get或$ .post。这些方法在SharePoint Framework中仍然可以正常工作,但请注意,SPFX带来了一些内置对象来发出Web请求–即HttpClient和BasicHttpClient对象。 HttpClient对象将自动将身份验证令牌添加到需要它们的传出请求中,因此调用Office 365 API,图形或其他由同一Azure AD保护的其他事物变得更加容易。一世’ll再说一些HttpClient / BasicHttpClient对象,但是在这篇文章中,我想重点介绍Promises和编码方面,所以让’s start there.

顺便说一句,我的建议是在jQuery AJAX上使用HttpClient对象,因为它简化了更改数据的POST请求。即使您有时可能会使用GET操作(例如我在针对SharePoint的这篇文章中’的搜索API),保持一致是有好处的。但是,我’在本文中,将显示两种方法(HttpClient和jQuery),以便您进行比较。

实施代码

The promise represents 数据 passed back 从 the async HTTP call, 和 provides 然后()抓住() 调用代码的方法–这使您可以实现一系列异步操作并处理每个操作的成功/失败。最好的做法通常是在TypeScript中创建一个接口或其他类型的协定来表示正在传递的数据。因此,在调用搜索的情况下,我们将返回结果项数组–但为了说明,让’s说我们也想返回其他一些属性,例如一条消息。然后,我们的界面可能类似于:

** N.B.这里有一个代码示例(以及本文的其他几个地方),但是不会在RSS阅读器中显示- 点击这里查看全文 **

这就是我们定义的接口(和SearchResult类)。但也请注意,使用返回明确定义的JSON的API时,您可能会选择定义其他接口,以便使用TypeScript中的强类型对象。理想情况下,应该有其他人为这些类/界面所用的打字文件,但是您要使用的许多SharePoint东西(例如SharePoint搜索结果)目前没有好的打字文件。因此,您可以定义自己的对象来表示对象层次结构,如下所示:

(向 埃里奥·斯特鲁夫(Elio Struyf) 在这里,我注意到他在 他的搜索网络零件样本 -这是我认为的常见方法。)

使用HttpClient对象发出Web请求

也许首先要提到的是SPFX中HttpClient和BasicHttpClient对象之间的区别。可以这样总结:

目的

采用

为什么

HttpClient 击中SharePoint REST服务 自动添加X-RequestDigest标头和值(您可以’d之前需要通过对/ _api / contextinfo的单独请求获得) 进行POST(即写)操作, 并设置其他一些合适的标题。
BasicHttpClient 打其他REST服务 采用ful for 任何 non-SharePoint API, without having to bring in an entire framework such as jQuery just for web requests.

下面的示例使用带有承诺的HttpClient。关于此代码的一些注意事项:

  • 由于HttpClient对象是通过Web部件访问的’的Context属性(IWebPartContext),我们需要在此访问该属性“middle-tier” code.
  • As usual, we resolve or reject the promise with the object that represents our 数据 - in this case an instance based on our custom interface.
  • 第一个功能是一个简单的功能,可在很大程度上重复使用。它返回的Promise类型是我们的自定义对象,代表来自SharePoint搜索API的JSON。您可以通过使用直接使用JSON“any”在TypeScript中而不是为此数据提供类型–但是您使用的代码不会自动完成。
  • 第二个功能完成了周围的工作:获取要使用的正确URL,并将原始搜索返回数据转换为我们真正想要传递回调用代码的对象–一个ISearchResult类型的Promise(带有Message和SearchResults数组的Promise)。

以便’s异步方法和使用HttpClient的调用代码。让’现在来看一下jQuery AJAX。

使用jQuery AJAX发出Web请求

我可以’真的没有想到使用jQuery AJAX而不是HttpClient的优势,除了您的开发团队可能更习惯了(事实上,’总是需要HttpClient给您的东西)。但是也许’有足够的理由– the objects aren’太不同了,可能无法使用’这不是我们应该虔诚的事情。

关于此代码的一些注意事项:

  • 整体结构非常相似–我们返回类型为ISearchResult的Promise,我们必须根据核心请求的成功/失败来解析/拒绝Promise。
  • 同样,我们可以通过为传递给done()回调的对象提供一种类型来对强类型对象进行处理(命名为“data”在我的代码中)。这使我们可以自动完成调用代码。
  • 可能需要进一步改进TypeScript,例如输入拒绝/解决对象。一世’m假设这是可能的,并且如果您发现自己经常在TypeScript中使用jQuery AJAX,则可能值得。

概要

以便’希望在您开始在SharePoint框架中做更多事情时有所用。还有其他一些TypeScript问题需要考虑,例如使用“fat arrow” syntax (=>)的匿名功能,但如果您不愿意,TSLint和默认设置将很乐意为您指出此类信息’t使用它们(以编译错误的形式:))。这里需要考虑的其他几件事包括我的同事和好友Vardhaman提供的信息 从SPFx Webpart向SharePoint发出POST请求 还有一个TypeScript的东西:

  • 如果你’为从SharePoint(或其他)API返回的JSON提供类型而苦苦挣扎,那么您可以选择将类型声明为“any”在您的TypeScript代码中。它’尽可能避免这种情况比较好,但是,罗马当时’一天建成吧? 微笑

2016年8月9日星期二

–提供演示幻灯片

我最近在2016年伦敦周六举行的SharePoint活动上做了演讲,主题是使用新SharePoint框架进行开发。随着越来越多的SharePoint开发人员开始意识到这一点,’这是一个巨大的变化时期,尽管SharePoint框架尚未达到总体可用性(在本文撰写时),’非常非常接近’最好开始吸收信息。我推迟发布此幻灯片,因为我知道自从我第一次看到Microsoft以来,它一直在对Framework进行一些更改,并打算向我们提供一些更新的信息,以便早期使用。我想要这个‘early preview’信息,以确保您*获得*框架时尽可能准确,而我’现在,我们已验证卡座中的所有内容仍然准确。

可以在SlideShare上从以下位置下载该平台 http://www.slideshare.net/chrisobrien/chris-obrien-introduction-to-the-sharepoint-framework-for-developers,但您也可以浏览下面的幻灯片。不幸的是演示没有’t在活动中记录– so I’我们添加了几张幻灯片来描述它们,以防万一。

 

期待

希望SharePoint框架将很快开始以“第一发行版”模式向Office 365租户推出。它’完全不同的开发经验,其回报是您可以开发出高性能的Web部件,这些部件在响应式设计中可以很好地工作,并且可以用于“modern pages”. Rememeber that it's not possible to use what we're now calling "classic" web parts in 现代页面, 和 given that both team sites 和 publishing sites in Office 365 will soon be able to use 现代页面, that alone makes the new model worthy of 在 tention. Additionally, it will come to on-premises SharePoint 2016 in a Feature Pack in 2017, so even if you're on-prem only it's perhaps advisable to start looking 在 this.

向上和向上!

2016年8月1日,星期一

沙箱代码在Office 365中不再可用–立即生效

大多数使用Office 365的技术人员都知道沙盒代码已过时了一段时间。这不’t mean 任何 沙盒解决方案已弃用 –取而代之的是,弃用在沙箱解决方案中专门指代* code *,因此我们指的是使用服务器端API的代码。不再支持任何代码沙箱解决方案(NCSS)。有关沙盒代码的预先警告是在2014年1月发布的, //blogs.msdn.microsoft.com/sharepointdev/2014/01/14/deprecation-of-custom-code-in-sandboxed-solutions/。但是从那以后,没有宣布实际删除功能的时间表–实际上,没有任何新闻。我什至从一些Microsoft同事那里听说,从SharePoint Online删除沙箱代码的紧迫性已经消失了,因为最初的操作问题并没有’实现后,实际上,工程团队能够在Office 365中很好地运行和扩展功能。

因此,上周一个大惊喜是许多租户突然删除了该功能。的“Activate”解决方案上的按钮不可用,并显示以下消息:

"在此网站集中,已禁用使用沙盒代码激活解决方案的功能。请与您的管理员联系,以使用此处发布的指南启用激活。"

SPO-禁用沙箱代码

一个非常有趣的方面是,即使您’不使用沙盒代码,而是*正在*部署代码汇编–这是Visual Studio中的默认设置! 因此,许多解决方案’真正使用沙箱代码仍然需要注意–开发人员将需要重新包装WSP,这次不包括自动生成的程序集。我将在稍后的内容中讨论具体更改“如何删除自动生成的沙箱程序集?” section.

微软官方公告

这会产生什么影响?

好吧,这取决于您属于哪个营地:

  1. 您’实际上并没有使用沙盒代码,而是部署了一些自动生成的程序集。
  2. 您 genuinely are using sandbox code.

对于数字1,您的开发人员将需要进行一些相对简单的更新。见“如何删除自动生成的沙箱程序集?” section.

对于数字2,简短的答案是您有问题。多少取决于 怎么样 沙盒代码正在使用中,以及您拥有多少。最终,您需要立即采取行动重新设计解决方案。您可以’不要等到计划了一些代码更改之后,因为解决方案的某些部分可能很快就会停止工作,并且您可能会遇到服务问题。 现在,您将无法添加新的沙箱代码或使用代码重新激活现有的沙箱WSP。此外,Microsoft消息指出您有30天之前 现有 代码将停止工作。 用技术术语来说,这意味着以下操作将停止工作:

  • 活动接收者
  • 功能接收器
  • 工作流程(编码)
  • InfoPath表单(如果在表单后面使用代码)
  • Web部件(如果使用沙盒代码进行编码)

确切地说,这对您的Intranet或解决方案意味着什么,取决于原始开发人员如何使用这些构建基块。

考虑影响

I’我真的很惊讶–在最初的弃用公告中,微软表示:

We realize that our customers have made investments in coded sandboxed solutions 和 we will phase them out 负责任地. Existing coded sandboxed solutions will continue to work in on-premises SharePoint farms for the foreseeable future.

幸运的是,我的客户/项目都没有受到影响,因为我们比使用这种方法构建解决方案更了解。但是我对处于不同情况的组织感到。我当然期待“final warning” period 和 I’d听说它说从那时起至少还有12个月的时间。但显然不是–而且我知道Microsoft可能没有违反这里的Office 365服务说明的任何合同或元素,但是我很难看到这是“responsibly”从服务中删除功能。

在相关说明中,我’我们正在与一家全球企业(超过100,000个用户)与Microsoft一起做一些工作,这些企业的Office 365内联网中具有沙箱代码–鉴于此,它’也许幸运的是他们还没有活着。我们没有’创建初始解决方案,但在我们的代码审查中标记了此内容以及其他一些内容。我建议Microsoft人员与他们的同事联系,以澄清关闭沙盒代码的时间表。有趣的是,回来的信息是“一切都应该至少持续12个月”, 和 so if it’这些家伙让我感到惊讶’s fair to say it’也让其他许多人感到惊讶。

通讯麻烦

值得注意的是,这在开始时就有些混乱。最初,这被报告为临时服务问题,并且管理员可能已经在Office 365消息中心中看到此消息:

SPO-沙盒代码服务问题_

但是,沙箱代码 真的是 被禁用–似乎有一段时间,Office 365中的其他团队没有’其实也不知道。现在,您将在Office 365管理中心中看到两件事之一:

状态

信息

您 have a problem –检测到沙盒代码

MC73347-我们’ve检测到您的租户帐户正在使用基于代码的沙箱解决方案.

请注意,我们’ve推进了我们删除2014年以前宣布的基于代码的沙箱解决方案的计划,如下所示: http://aka.ms/sandboxcode

请注意,仍然完全支持声明性(无代码)沙箱解决方案。

这对我有什么影响?

作为删除过程的一部分,不再提供基于代码的新沙盒解决方案的激活以及现有解决方案的更新。在大约30天之内,SharePoint Online环境中当前正在运行的基于代码的沙箱解决方案将被禁用。如果您遇到麻烦,请与我们联系,因为我们的产品和客户支持团队已准备好在此过渡期间为您提供支持。

您’re OK – no检测到沙盒代码

SP73009-定制解决方案和工作流程-误报

突发事件客户影响范围已更新。持续的客户影响分析已确定您的服务不受此事件影响

以便’这似乎是最后的故事。

如何删除自动生成的沙箱程序集?

如前所述,开发人员可能需要在没有自动生成的程序集的情况下重新打包WSP解决方案。 您 can do this by setting the “将组件包括在包装中”项目属性为false:

clip_image005

下次进行某些开发或维护时,可能需要此步骤– effectively 任何thing that would require 激活 WSP的另一个版本。

概要

我们依靠Microsoft在运行Office 365(和本地SharePoint)方面做出正确的决定。一世’我不知道现实解决方案中沙盒代码的规模,但我真的希望这种处理方式不会’不会对太多组织造成严重影响。您受此影响吗?还是您有其他观点?一世’d有兴趣了解如何收到此信息–随时发表评论,让我知道。