SharePoint 调用第三方REST API

1,524 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:11月更文挑战

调用第三方REST API

在SharePoint 框架中使用REST API 在前面已经写过了

SharePoint 框架项目的一个常见要求是它们显示 Web 部件外部的数据交互,这就需要调用第三方的API。

HttpClientAPI是在SharePoint框架项目大部分HTTP请求的基石。您将使用HttpClientAPI 主要向第三方 API 提交匿名请求。该SPHttpClientAPI扩展HttpClient以包括由在SharePoint REST API使用必要HTTP请求头。例如,SPHttpClient自动包含odata-version设置为4将 SharePoint REST API 从默认 OData v3 协议配置为 OData v4的HTTP 请求标头。

这些相关的 HTTP 请求 API 都不需要开发人员安装额外的客户端或库;默认的 SharePoint 框架项目包括您在项目中向 REST API 提交请求所需的一切。

创建 SharePoint 框架解决方案

打开命令提示符并切换到要创建项目的文件夹。通过执行以下命令运行 SharePoint Yeoman 生成器:

yo @microsoft/sharepoint

请选择 webpart 并使用react框架

更新 React 组件的公共接口

找到并打开文件 ./src/webparts/spFxHttpClient/components/ISpFxHttpClientProps.ts。这是 React 组件上公共属性的接口。

更新接口以description使用将包含自定义对象的属性替换现有属性。这个对象很复杂,虽然您可以创建一个接口来表示它,但在本实验中,您将把这种复杂性放在一边,专注于使用无类型的 TypeScript 对象。

export interface ISpFxHttpClientDemoProps {
  apolloMissionImage: any;
}

实现 Web 部件的用户界面

找到并打开文件 ./src/webparts/spFxHttpClient/components/SpFxHttpClient.module.scss

.list {
  color: $ms-color-themeDark;
  background-color: $ms-color-themeLight;
  font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif;
  font-size: 14px;
  font-weight: normal;
  box-sizing: border-box;
  margin: 0 0;
  padding: 10px 0 100px 0;
  line-height: 50px;
  list-style-type: none;
}
​
.item {
  color: $ms-color-themeDark;
  background-color: $ms-color-themeLighterAlt;
  vertical-align: center;
  font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif;
  font-size: 14px;
  font-weight: normal;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  box-shadow: none;
  *zoom: 1;
  padding: 0 15px;
  position: relative;
  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);
}

./src/webparts/spFxHttpClient/components/SpFxHttpClient.tsx.

修改render()方法

<div className={ styles.spFxHttpClient }>
  <div className={ styles.container }>
    <div className={ styles.row }>
      <div className={ styles.column }>
        <span className={ styles.title }>HttpClient Demo</span>
      </div>
    </div>
​
    <div className={ styles.row }>
      <img src={ this.props.apolloMissionImage.links[0].href } />
      <div><strong>Title:</strong> { this.props.apolloMissionImage.data[0].title }</div>
      <div><strong>Keywords:</strong></div>
      <ul className={ styles.list }>
        { this.props.apolloMissionImage &&
          this.props.apolloMissionImage.data[0].keywords.map( (keyword) =>
            <li key={ keyword} className={ styles.item }>
              { keyword }
            </li>
          )
        }
      </ul>
    </div>
​
  </div>
</div>

实现webpart 逻辑

./src/webparts/spFxHttpClient/SpFxHttpClientWebPart.ts

TypeScriptCopy

import {
  HttpClient,
  HttpClientResponse
} from '@microsoft/sp-http';

SpFxHttpClientWebPart

//这是实现官方文档上的API 请求的是一张NASA的图片
private _getApolloImage(): Promise<any> {
  return this.context.httpClient.get(
    `https://images-api.nasa.gov/search?q=Apollo%204&media_type=image`,
    HttpClient.configurations.v1
  )
  .then((response: HttpClientResponse) => {
    return response.json();
  })
  .then(jsonResponse => {
    return jsonResponse;
  }) as Promise<any>;
}

此方法使用HttpClient当前 SharePoint 上下文中的可用信息,并向 NASA Image REST API 发出 HTTP GET 请求,查询等于Apollo 4。处理对 JSON 的响应后,它作为无类型any对象返回给调用者。

render()方法的内容更新为以下代码:

public render(): void {
  if (!this.renderedOnce) {
    this._getApolloImage()
      .then(response => {
        const element: React.ReactElement<ISpFxHttpClientProps > = React.createElement(
          SpFxHttpClient,
          {
            apolloMissionImage: response.collection.items[0]
          }
        );
​
        ReactDom.render(element, this.domElement);
      });
  }
}

在此代码中,我们添加了检查以查看 Web 部件是否已在页面上呈现。如果没有,它会调用_getApolloImage()之前添加的方法。当它收到响应时,它会附加 NASA Imagery REST API 返回的结果中的第一项。

测试webpart

使用命令

gulp serve

image.png

修改成你想要的API

比如我修改了高德地图旗下的 天气API 修改相关的显示文字

image.png