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 规则来执行这一决定。