Skip to main content

ADR013正确使用 HTTP 抓取库

上下文

使用多个 HTTP 软件包获取数据会增加复杂性,也会增加更新软件包的支持负担。

决定

后端(节点)软件包应使用node-fetch用于获取 HTTP 数据的软件包。 示例

import fetch from 'node-fetch';
import { ResponseError } from '@backstage/errors';

const response = await fetch('https://example.com/api/v1/users.json');
if (!response.ok) {
throw await ResponseError.fromResponse(response);
}
const users = await response.json();

前端插件和软件包应优先使用fetchApiRef它使用cross-fetch在内部:

import { useApi } from '@backstage/core-plugin-api';
const { fetch } = useApi(fetchApiRef);

const response = await fetch('https://example.com/api/v1/users.json');
if (!response.ok) {
throw await ResponseError.fromResponse(response);
}
const users = await response.json();

同构软件包应依赖于cross-fetch类型的参数。typeof fetch的首选实现。fetch这样,他们就可以在调用中添加认证或其他信息,并以跨平台的方式跟踪指标等。 示例:..:

import crossFetch from 'cross-fetch';

export class MyClient {
private readonly fetch: typeof crossFetch;

constructor(options: { fetch?: typeof crossFetch }) {
this.fetch = options.fetch || crossFetch;
}

async users() {
return await this.fetch('https://example.com/api/v1/users.json');
}
}

后果

我们将逐步淘汰第三方软件包,如axios,got一旦我们过渡到node-fetch我们将添加 lint 规则来执行这一决定。