Skip to main content

使用您自己的基础 URL

Orval 允许您为每个 OpenAPI 规范设置自定义基础 URL。这可以是规范中省略的 URL 部分或整个 URL。您还可以配置 Orval 读取规范中的 servers 字段。

module.exports = {
petstore: {
output: {
target: 'src/petstore.ts',
baseUrl: '/api/v2',
// baseUrl: 'https://petstore.swagger.io/v2',
},
},
};

使用 OpenAPI 规范中的 URL

如果您想使用规范中定义的 URL(由 servers 字段描述),可以将 getBaseUrlFromSpecification 设置为 true,这将使 Orval 正确识别每个操作使用的基础 URL。在 输出配置 中了解更多关于不同设置的信息。

module.exports = {
petstore: {
output: {
target: 'src/petstore.ts',
baseUrl: {
getBaseUrlFromSpecification: true,
variables: {
environment: 'api.dev',
},
},
},
},
};

也可以在您的 HTTP 客户端上直接配置基础 URL。

Axios

您可以为所有请求设置默认的 baseUrl:

axios.defaults.baseURL = '<BACKEND URL>'; // 在此处使用您自己的 URL 或环境变量

您也可以使用拦截器来实现:

axios.interceptors.request.use((config) => {
return {
...config,
baseURL: '<BACKEND URL>', // 在此处使用您自己的 URL 或环境变量
};
});

还可以创建自定义的 axios 实例。查看 完整指南 了解更多详情。

const AXIOS_INSTANCE = axios.create({ baseURL: '<BACKEND URL>' }); // 在此处使用您自己的 URL 或环境变量

Fetch 客户端

另外,如果您使用 fetch 客户端,仍然可以通过自定义 fetch 客户端设置请求 URL。

const getUrl = (contextUrl: string): string => {
const url = new URL(contextUrl);
const pathname = url.pathname;
const search = url.search;
const baseUrl =
process.env.NODE_ENV === 'production'
? 'productionBaseUrl'
: 'http://localhost:3000';
const requestUrl = new URL(`${baseUrl}${pathname}${search}`);
return requestUrl.toString();
};
export const customFetch = async <T>(
url: string,
options: RequestInit,
): Promise<T> => {
const requestUrl = getUrl(url);
const requestInit: RequestInit = {
...options,
};
const request = new Request(requestUrl, requestInit);
const response = await fetch(request);
const data = await getBody<T>(response);
return { status: response.status, data } as T;
};

请参考完整示例 这里

Angular HTTP 客户端

您可以使用拦截器自动添加 API 的 URL。就像添加授权头一样。

import { Injectable } from '@angular/core';
import {
HttpEvent,
HttpInterceptor,
HttpHandler,
HttpRequest,
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class APIInterceptor implements HttpInterceptor {
intercept(
req: HttpRequest<any>,
next: HttpHandler,
): Observable<HttpEvent<any>> {
const apiReq = req.clone({ url: `<BACKEND URL>/${req.url}` });
return next.handle(apiReq);
}
}

还要记住在模块的提供者中添加拦截器。

providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: APIInterceptor,
multi: true,
},
];

其他客户端

根据您使用的客户端,您需要自己添加它

Was this page helpful?