Skip to content

Instantly share code, notes, and snippets.

@EnetoJara
Last active December 7, 2022 20:14
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save EnetoJara/331960fbb8744abca3d7dd600a28e829 to your computer and use it in GitHub Desktop.
Save EnetoJara/331960fbb8744abca3d7dd600a28e829 to your computer and use it in GitHub Desktop.
import * as qs from "qs";
import { PathLike } from "fs";
export const apiConfig = {
returnRejectedPromiseOnError: true,
withCredentials: true,
timeout: 30000,
baseURL: "https://jsonplaceholder.typicode.com/",
headers: {
common: {
"Cache-Control": "no-cache, no-store, must-revalidate",
Pragma: "no-cache",
"Content-Type": "application/json",
Accept: "application/json",
},
},
paramsSerializer: (params: PathLike) => qs.stringify(params, { indices: false }),
}
import { Axios } from "./axios";
import {
AxiosRequestConfig,
AxiosResponse,
AxiosError,
} from "axios";
/**
* @class Api Class is a fancy es6 wrapper class for axios.
*
* @param {import("axios").AxiosRequestConfig} config - axios Request Config.
* @link [AxiosRequestConfig](https://github.com/axios/axios#request-config)
*/
export class Api extends Axios {
private token: string;
/**
* Creates an instance of api.
* @param {import("axios").AxiosRequestConfig} conf
*/
public constructor (conf: AxiosRequestConfig) {
super(conf);
this.token="";
this.getToken = this.getToken.bind(this);
this.setToken = this.setToken.bind(this);
this.getUri = this.getUri.bind(this);
this.request = this.request.bind(this);
this.get = this.get.bind(this);
this.options = this.options.bind(this);
this.delete = this.delete.bind(this);
this.head = this.head.bind(this);
this.post = this.post.bind(this);
this.put = this.put.bind(this);
this.patch = this.patch.bind(this);
this.success = this.success.bind(this);
this.error = this.error.bind(this);
this.interceptors.request.use((param) => {
return {
...param,
defaults: {
headers: {
...param.headers,
"Authorization": `Bearer ${this.getToken()}`
},
}
}
}, (error) => {
// handling error
});
// this middleware is been called right before the response is get it by the method that triggers the request
this.interceptors.response.use((param) => ({
...param
}, (error) => {
// handling error
}));
}
/**
* Gets Token.
*
* @returns {string} token.
* @memberof Api
*/
public getToken (): string {
return `Bearer ${this.token}`;
}
/**
* Sets Token.
*
* @param {string} token - token.
* @memberof Api
*/
public setToken (token: string): void {
this.token = token;
}
/**
* Get Uri
*
* @param {import("axios").AxiosRequestConfig} [config]
* @returns {string}
* @memberof Api
*/
public getUri (config?: AxiosRequestConfig): string {
return this.getUri(config);
}
/**
* Generic request.
*
* @access public
* @template T - `TYPE`: expected object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} - HTTP axios response payload.
* @memberof Api
*
* @example
* api.request({
* method: "GET|POST|DELETE|PUT|PATCH"
* baseUrl: "http://www.domain.com",
* url: "/api/v1/users",
* headers: {
* "Content-Type": "application/json"
* }
* }).then((response: AxiosResponse<User>) => response.data)
*
*/
public request<T, R = AxiosResponse<T>>(
config: AxiosRequestConfig
): Promise<R> {
return this.request(config);
}
/**
* HTTP GET method, used to fetch data `statusCode`: 200.
*
* @access public
* @template T - `TYPE`: expected object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} HTTP `axios` response payload.
* @memberof Api
*/
public get<T, R = AxiosResponse<T>>(
url: string,
config?: AxiosRequestConfig
): Promise<R> {
return this.get (url, config);
}
/**
* HTTP OPTIONS method.
*
* @access public
* @template T - `TYPE`: expected object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} HTTP `axios` response payload.
* @memberof Api
*/
public options<T, R = AxiosResponse<T>>(
url: string,
config?: AxiosRequestConfig
): Promise<R> {
return this.options (url, config);
}
/**
* HTTP DELETE method, `statusCode`: 204 No Content.
*
* @access public
* @template T - `TYPE`: expected object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} - HTTP [axios] response payload.
* @memberof Api
*/
public delete<T, R = AxiosResponse<T>>(
url: string,
config?: AxiosRequestConfig
): Promise<R> {
return this.delete (url, config);
}
/**
* HTTP HEAD method.
*
* @access public
* @template T - `TYPE`: expected object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} - HTTP [axios] response payload.
* @memberof Api
*/
public head<T, R = AxiosResponse<T>>(
url: string,
config?: AxiosRequestConfig
): Promise<R> {
return this.head (url, config);
}
/**
* HTTP POST method `statusCode`: 201 Created.
*
* @access public
* @template T - `TYPE`: expected object.
* @template B - `BODY`: body request object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {B} data - payload to be send as the `request body`,
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} - HTTP [axios] response payload.
* @memberof Api
*/
public post<T, B, R = AxiosResponse<T>>(
url: string,
data?: B,
config?: AxiosRequestConfig
): Promise<R> {
return this.post (url, data, config);
}
/**
* HTTP PUT method.
*
* @access public
* @template T - `TYPE`: expected object.
* @template B - `BODY`: body request object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {B} data - payload to be send as the `request body`,
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} - HTTP [axios] response payload.
* @memberof Api
*/
public put<T, B, R = AxiosResponse<T>>(
url: string,
data?: B,
config?: AxiosRequestConfig
): Promise<R> {
return this.put (url, data, config);
}
/**
* HTTP PATCH method.
*
* @access public
* @template T - `TYPE`: expected object.
* @template B - `BODY`: body request object.
* @template R - `RESPONSE`: expected object inside a axios response format.
* @param {string} url - endpoint you want to reach.
* @param {B} data - payload to be send as the `request body`,
* @param {import("axios").AxiosRequestConfig} [config] - axios request configuration.
* @returns {Promise<R>} - HTTP [axios] response payload.
* @memberof Api
*/
public patch<T, B, R = AxiosResponse<T>>(
url: string,
data?: B,
config?: AxiosRequestConfig
): Promise<R> {
return this.patch (url, data, config);
}
/**
*
* @template T - type.
* @param {import("axios").AxiosResponse<T>} response - axios response.
* @returns {T} - expected object.
* @memberof Api
*/
public success<T>(response: AxiosResponse<T>): T {
return response.data;
}
/**
*
*
* @template T type.
* @param {AxiosError<T>} error
* @memberof Api
*/
public error<T> (error: AxiosError<T>): void {
throw error;
}
}
import axios, { AxiosInterceptorManager, AxiosRequestConfig, AxiosResponse } from "axios";
export class Axios {
public interceptors: {
/**
* The **Request** interceptor will be call rigth before the `http request`
* @summary
* This a useful method especially if you need to send a token on each request.
*/
request: AxiosInterceptorManager<AxiosRequestConfig>;
/**
* The **Response** interceptor will be call rigth before the `http request` is received.
* @summary
* This a useful method especially if you need to send a token on each request.
*/
response: AxiosInterceptorManager<AxiosResponse>;
};
constructor(config: AxiosRequestConfig) {
return axios.create(config);
}
}
@ManAnRuck
Copy link

I think you have to remove the part from line 45. its duplicated with syntax error
https://gist.github.com/EnetoJara/331960fbb8744abca3d7dd600a28e829#file-api-ts-L45-L81

@EnetoJara
Copy link
Author

I think you have to remove the part from line 45. its duplicated with syntax error
https://gist.github.com/EnetoJara/331960fbb8744abca3d7dd600a28e829#file-api-ts-L45-L81

I think you have to remove the part from line 45. its duplicated with syntax error
https://gist.github.com/EnetoJara/331960fbb8744abca3d7dd600a28e829#file-api-ts-L45-L81

Sorry for the delay. Thank you for letting me know. If there is anything el please feel free to add/modify it

@mizhon
Copy link

mizhon commented Oct 3, 2020

Hi, why not add the response interceptor?

@EnetoJara
Copy link
Author

Hi, why not add the response interceptor?

Sorry for not responding b4, I just add them

@hugo-licon
Copy link

hugo-licon commented Oct 31, 2020

I'm getting this error: Type 'AxiosStatic' is not a constructor function type.ts(2507) while trying to extends from axios export class Api extends Axios {
I read on your post that you're importing axios like this: import { Axios } from "./axios";. What's the content of this file?

@a-m-dev
Copy link

a-m-dev commented Nov 5, 2020

Thanks man for the Axios file !

@hell0-world
Copy link

Hi, I have a question at line 46

I think it have to change to Authorization: this.getToken(),.

Because getToken() method also return the token with Bearer at line 68

Thank you for your file :)

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