Skip to content

Commit 80304d9

Browse files
authored
Merge pull request #1434 from Or-Zarchi-Forter/master
Allow usage of a custom axios instance
2 parents c13e9dc + f27366c commit 80304d9

File tree

3 files changed

+55
-5
lines changed

3 files changed

+55
-5
lines changed

docs/axios-support.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,51 @@ in your `tsconfig.json` file:
2424
}
2525
}
2626
```
27+
28+
29+
## Using a custom Axios client
30+
31+
Sometime you may want to use your own Axios client created by `axios.create` for advanced configuration (e.g. Usage of the popular [axios-retry](https://github.com/softonic/axios-retry) interceptor) without having to [reimplement](./custom-request-file.md) the entire generated Axios request function.
32+
33+
In those cases, simply construct your own HttpRequest wrapper implementation and pass it into your API client
34+
35+
## Example
36+
37+
Create a file that looks like this, that references file from the `/core` folder of the generated client.
38+
39+
```typescript
40+
41+
import axios from 'axios';
42+
import axiosRetry from 'axios-retry';
43+
import { request as __request } from './request';
44+
import { CancelablePromise } from './CancelablePromise';
45+
import { BaseHttpRequest } from './BaseHttpRequest';
46+
import { ApiRequestOptions } from './ApiRequestOptions';
47+
import type { OpenAPIConfig } from './OpenAPI';
48+
49+
50+
export class AxiosHttpRequestWithRetry extends BaseHttpRequest {
51+
axiosInstance = axios.create();
52+
53+
constructor(config: OpenAPIConfig) {
54+
super(config);
55+
axiosRetry(this.axiosInstance);
56+
}
57+
58+
public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {
59+
return __request(this.config, options, this.axiosInstance);
60+
}
61+
}
62+
63+
```
64+
65+
Then, when instantiating your generated test client, pass in your custom request wrapper class:
66+
67+
```typescript
68+
69+
import { AxiosHttpRequestWithRetry } from './AxiosRequestWithRetry';
70+
import { GeneratedClient } from './generated/client';
71+
72+
const client = new GeneratedClient({ BASE: 'http://localhost:8123' }, AxiosHttpRequestWithRetry)
73+
74+
```

src/templates/core/axios/request.hbs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{{>header}}
22

33
import axios from 'axios';
4-
import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
4+
import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios';
55
import FormData from 'form-data';
66

77
import { ApiError } from './ApiError';
@@ -66,10 +66,11 @@ import type { OpenAPIConfig } from './OpenAPI';
6666
* Request method
6767
* @param config The OpenAPI configuration object
6868
* @param options The request options from the service
69+
* @param axiosClient The axios client instance to use
6970
* @returns CancelablePromise<T>
7071
* @throws ApiError
7172
*/
72-
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
73+
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => {
7374
return new CancelablePromise(async (resolve, reject, onCancel) => {
7475
try {
7576
const url = getUrl(config, options);
@@ -78,7 +79,7 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): C
7879
const headers = await getHeaders(config, options, formData);
7980

8081
if (!onCancel.isCancelled) {
81-
const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel);
82+
const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient);
8283
const responseBody = getResponseBody(response);
8384
const responseHeader = getResponseHeader(response, options.responseHeader);
8485

src/templates/core/axios/sendRequest.hbs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ export const sendRequest = async <T>(
55
body: any,
66
formData: FormData | undefined,
77
headers: Record<string, string>,
8-
onCancel: OnCancel
8+
onCancel: OnCancel,
9+
axiosClient: AxiosInstance
910
): Promise<AxiosResponse<T>> => {
1011
const source = axios.CancelToken.source();
1112

@@ -21,7 +22,7 @@ export const sendRequest = async <T>(
2122
onCancel(() => source.cancel('The user aborted a request.'));
2223

2324
try {
24-
return await axios.request(requestConfig);
25+
return await axiosClient.request(requestConfig);
2526
} catch (error) {
2627
const axiosError = error as AxiosError<T>;
2728
if (axiosError.response) {

0 commit comments

Comments
 (0)