为了能够做任何有用的事情,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.
实施代码
The promise represents 数据 passed back 从 the async HTTP call, 和 provides 然后() 和 抓住() 调用代码的方法–这使您可以实现一系列异步操作并处理每个操作的成功/失败。最好的做法通常是在TypeScript中创建一个接口或其他类型的协定来表示正在传递的数据。因此,在调用搜索的情况下,我们将返回结果项数组–但为了说明,让’s说我们也想返回其他一些属性,例如一条消息。然后,我们的界面可能类似于:
这就是我们定义的接口(和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代码中。它’尽可能避免这种情况比较好,但是,罗马当时’一天建成吧?