如何在 React 中使用生成的 OpenAPI 客户端?
How to use generated OpenAPI client inside React?
我已经用 openapi-generator-cli generate -i https://linktomybackendswagger/swagger.json -g typescript-axios -o src/components/api --additional-properties=supportsES6=true
生成了我的 API 客户端
现在我的项目中有了所有文件,但我不知道如何实现它。
如何实例化 API?我在哪里配置要使用的访问令牌?我如何知道端点的每个方法名称?
经过 2 小时的谷歌搜索后,我似乎找不到有关最基本设置问题的文档。也许我只是在错误的地方寻找。有人能指出我正确的方向吗?
好的,所以我想出了一个我认为很干净的方法,我将在此处为其他走相同路径的人记录下来,即:
- 使用正在使用
Authorization: Bearer <Token here>
的 API
- 使用
-g typescript-axios
创建了 openapi-generator-cli
的客户端
- 使用 OAS3
假设您有一个名为 UserPolicies
的端点。通过 CLI 生成代码后,每个端点将在生成的文件 api.ts
中拥有自己的 class,名称扩展如下 UserPoliciesApi
.
要使用该端点,需要进行以下设置。
示例:内部 UserPolicyList.tsx
:
import { UserPoliciesApi } from './components/api/api';
import { Configuration } from './components/api/configuration';
const openapiConfig = new Configuration();
openapiConfig.baseOptions = {
headers: { Authorization: 'Bearer ' + cookies.access_token },
};
const openapi = new UserPoliciesApi(openapiConfig);
假设您想为 api/Policies
进行 GET 调用,您可以使用:
openapi.userPoliciesGetPolicies.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
现在,我发现这种设计的不便之处在于进行简单 api 调用所需的样板代码。我希望能够简单地进行一次导入,并且已经有了 access_token
设置。
所以我创建了一个包装器 class 像这样 MyApi.tsx
:
import { Cookies } from 'react-cookie';
import { Configuration } from './components/api/configuration';
class MyApi {
private cookies: Cookies;
constructor() {
this.cookies = new Cookies();
}
private accessToken = () => {
return this.cookies.get('access_token');
};
private configuration = () => {
const openapiConfig = new Configuration();
openapiConfig.baseOptions = {
headers: { Authorization: 'Bearer ' + this.accessToken() },
};
return openapiConfig;
};
public userPoliciesApi = () => {
const api = new UserPoliciesApi(this.configuration());
return api;
};
}
export default MyApi.tsx;
现在我可以很容易地替换样板并用这个调用:
里面 UserPolicyList.tsx
:
import { MyApi } from './components/myapi/MyApi.tsx';
const api = new MyApi();
api.userPoliciesApi.userPoliciesGetPolicies.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
我已经用 openapi-generator-cli generate -i https://linktomybackendswagger/swagger.json -g typescript-axios -o src/components/api --additional-properties=supportsES6=true
现在我的项目中有了所有文件,但我不知道如何实现它。 如何实例化 API?我在哪里配置要使用的访问令牌?我如何知道端点的每个方法名称?
经过 2 小时的谷歌搜索后,我似乎找不到有关最基本设置问题的文档。也许我只是在错误的地方寻找。有人能指出我正确的方向吗?
好的,所以我想出了一个我认为很干净的方法,我将在此处为其他走相同路径的人记录下来,即:
- 使用正在使用
Authorization: Bearer <Token here>
的 API
- 使用
-g typescript-axios
创建了 - 使用 OAS3
openapi-generator-cli
的客户端
假设您有一个名为 UserPolicies
的端点。通过 CLI 生成代码后,每个端点将在生成的文件 api.ts
中拥有自己的 class,名称扩展如下 UserPoliciesApi
.
要使用该端点,需要进行以下设置。
示例:内部 UserPolicyList.tsx
:
import { UserPoliciesApi } from './components/api/api';
import { Configuration } from './components/api/configuration';
const openapiConfig = new Configuration();
openapiConfig.baseOptions = {
headers: { Authorization: 'Bearer ' + cookies.access_token },
};
const openapi = new UserPoliciesApi(openapiConfig);
假设您想为 api/Policies
进行 GET 调用,您可以使用:
openapi.userPoliciesGetPolicies.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
现在,我发现这种设计的不便之处在于进行简单 api 调用所需的样板代码。我希望能够简单地进行一次导入,并且已经有了 access_token
设置。
所以我创建了一个包装器 class 像这样 MyApi.tsx
:
import { Cookies } from 'react-cookie';
import { Configuration } from './components/api/configuration';
class MyApi {
private cookies: Cookies;
constructor() {
this.cookies = new Cookies();
}
private accessToken = () => {
return this.cookies.get('access_token');
};
private configuration = () => {
const openapiConfig = new Configuration();
openapiConfig.baseOptions = {
headers: { Authorization: 'Bearer ' + this.accessToken() },
};
return openapiConfig;
};
public userPoliciesApi = () => {
const api = new UserPoliciesApi(this.configuration());
return api;
};
}
export default MyApi.tsx;
现在我可以很容易地替换样板并用这个调用:
里面 UserPolicyList.tsx
:
import { MyApi } from './components/myapi/MyApi.tsx';
const api = new MyApi();
api.userPoliciesApi.userPoliciesGetPolicies.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});