Define and Call your restful APIs like a function.
This package is based on @single9/api-tester
but use Axios instead of Request.
npm i @single9/api-wrapper
const ApiWrapper = require('@single9/api-wrapper');
const api = new ApiWrapper([
{
name: '<Api Name>', // only allow certain words and digits
path: '<Api Path>', // e.g. /api/posts
method: '<HTTP Method>', // e.g. post or POST
},
], {
configureAxios(axios){
// The axios you can add interceptors or global functions.
},
baseUrl: '<Base URL of API>', // e.g. https://jsonplaceholder.typicode.com
// Default: http://localhost:3000
headers: {
// The headers you want to send. e.g. 'authorization': 'Bearer SAdoweasd...',
},
auth: { // authorization
username: 'username',
password: 'password',
}
})
You can use factory function to dynamically set the base URL. This is useful if your host domain is a SRV record.
Example
const api = new ApiWrapper([
{
name: '<Api Name>', // only allow certain words and digits
path: '<Api Path>', // e.g. /api/posts
method: '<HTTP Method>', // e.g. post or POST
},
], {
baseUrl: async () => resolveSRV(process.env.API_HOST),
});
api.<api_name>(params)
- api: Your
ApiWrapper
instance. - api_name: The name of the API that you set before.
- params: Compatible with axios request config
- queryString
- pathParams
Used for query string. e.g. /users?limit=100
api.test({
queryString: {
key: value
}
})
api.test({
queryString: [
{
name: string,
value: string | number,
}
]
})
Used for path parameters. e.g. /user/:id
api.test({
pathParams: {
key: value
}
})
api.test({
pathParams: [
{
name: string,
value: string | number,
}
]
})
const ApiWrapper = require('@single9/api-wrapper');
// Create your API schema
const schema = [
{
name: 'newPost', // this is your api function name
path: '/posts',
method: 'post',
},
{
name: 'getTodo',
path: '/todos/:todoId', // path parameter
method: 'get',
},
];
const api = new ApiWrapper(schema, {
configureAxios(item){
item.interceptors.request.use(
(request) => { console.log('url: %s , req: %o', request.url); return request; },
)
item.interceptors.response.use(
(response) => { console.log('url: %s , res: %o', response.url, response.data); return response; },
)
},
baseUrl: 'https://jsonplaceholder.typicode.com',
});
async function start() {
try {
const post = await api.newPost({
// Post Body
data: {
title: 'foo!!!!!!',
body: 'bar!!',
userId: 1
},
});
console.log(post.data);
const get = await api.getTodo({
pathParams: {
todoId: 2, // replace `:todoId` with value 2.
},
});
console.log(get.data);
} catch (err) {
console.error(err);
}
}
start();