Skip to content

Instantly share code, notes, and snippets.

@ankit-kumar-jat
Last active December 24, 2024 19:58
Show Gist options
  • Save ankit-kumar-jat/a6e02fb0ddc4d50473eefbcb8607668b to your computer and use it in GitHub Desktop.
Save ankit-kumar-jat/a6e02fb0ddc4d50473eefbcb8607668b to your computer and use it in GitHub Desktop.
Axios Base Query for RTK Query (redux toolkit)
import axios from 'axios'
export const axiosBaseQuery =
({ baseUrl, prepareHeaders }) => {
return async ({ url, method, body: data, params, ...rest }, api) => {
try {
// this to allow prepare headers
if (prepareHeaders) {
axios.interceptors.request.use(function (config) {
const newHeaders = prepareHeaders(config.headers, api);
config.headers = { ...config.headers, ...newHeaders }
return config;
})
}
const result = await axios({ url, baseURL: baseUrl, method, data, params, ...rest, signal: api.signal })
return {
data: result.data,
meta: {
headers: result.headers,
status: result.status,
config: result.config,
request: result.request,
}
}
} catch (axiosError) {
let err = axiosError
return {
error: {
status: err.response?.status,
data: err.response?.data || err.message,
headers: err.response?.headers
},
}
}
}
}
export default axiosBaseQuery
@DementedEarplug
Copy link

DementedEarplug commented Jun 15, 2023

Do you have an example of how to use the prepareHeaders with this axiosBaseQuery? I keep getting headers.set is not a fucntion.

@ahmeturganci
Copy link

ahmeturganci commented Dec 24, 2024

here is the .ts version

import axios, { AxiosRequestConfig, AxiosError, AxiosHeaders } from 'axios';
import { BaseQueryFn } from '@reduxjs/toolkit/query';

interface AxiosBaseQueryArgs {
  baseUrl: string;
  prepareHeaders?: (headers: AxiosHeaders, api: any) => AxiosHeaders;
}

interface AxiosBaseQueryParams {
  url: string;
  method: AxiosRequestConfig['method'];
  body?: any;
  params?: Record<string, any>;
  [key: string]: any;
}

export const axiosBaseQuery =
  ({ baseUrl, prepareHeaders }: AxiosBaseQueryArgs): BaseQueryFn<AxiosBaseQueryParams> =>
  async ({ url, method, body: data, params, ...rest }, api) => {
    try {
      // this to allow prepare headers 
      if (prepareHeaders) {
        axios.interceptors.request.use(function (config) {
          const newHeaders = prepareHeaders(config.headers as AxiosHeaders, api);
          config.headers = newHeaders;
          return config;
        });
      }

      const result = await axios({
        url,
        baseURL: baseUrl,
        method,
        data,
        params,
        ...rest,
        signal: api.signal,
      });

      return {
        data: result.data,
        meta: {
          headers: result.headers,
          status: result.status,
          config: result.config,
          request: result.request,
        },
      };
    } catch (axiosError) {
      const err = axiosError as AxiosError;
      return {
        error: {
          status: err.response?.status,
          data: err.response?.data || err.message,
          headers: err.response?.headers,
        },
      };
    }
  };

export default axiosBaseQuery;

@ceyhun-akyol
Copy link

Type '{ [x: string]: any; Accept?: AxiosHeaderValue | undefined; "Content-Length"?: AxiosHeaderValue | undefined; "User-Agent"?: AxiosHeaderValue | undefined; "Content-Encoding"?: AxiosHeaderValue | undefined; Authorization?: AxiosHeaderValue | undefined; 'Content-Type'?: ContentType | undefined; }' is not assignable to type 'AxiosRequestHeaders'.
Type '{ [x: string]: any; Accept?: AxiosHeaderValue | undefined; "Content-Length"?: AxiosHeaderValue | undefined; "User-Agent"?: AxiosHeaderValue | undefined; "Content-Encoding"?: AxiosHeaderValue | undefined; Authorization?: AxiosHeaderValue | undefined; 'Content-Type'?: ContentType | undefined; }' is missing the following properties from type 'AxiosHeaders': set, get, has, delete, and 23 more.ts(2322)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment