Antonio
The HTTP client uses axios for making all HTTP requests and @ackee/petrus for adding an access token to HTTP Authorization header.
Table of contents
Installing
Using yarn:
$ yarn add @ackee/antonio
Using npm:
$ npm i -S @ackee/antonio
Initialization
Initialization is a simple 2 steps process.
By creating a new instance of HttpClient
, you will get api
, authApi
objects and saga
function. Then you connect the saga among your other sagas. That's all.
1. Create httpClient
instance
Create one httpClient
instance object per project.
import * as Antonio from '@ackee/antonio';
const { api, authApi, saga } = Antonio.create({
baseURL: 'https://base-url.com/api/',
});
export { api, authApi, saga };
2. Launch HttpClient saga
import { saga as httpClient } from 'Config/antonio';
export default function*() {
yield all([httpClient()]);
}
Usage
api
- unauthorized requests
See available properties of the api
object.
import { api } from 'Config/antonio';
async function fetchTodo(todoId) {
const response = await api.get('/todos/:todoId', {
baseURL: 'https://jsonplaceholder.typicode.com/',
uriParams: {
todoId,
},
});
return response.data;
}
authApi
- authorized requests
By using methods under authApi
object, it's guaranteed that each HTTP request is going to have access token in its Authorization
header.
If the access token isn't available at the moment, the request is paused by take(ACCESS_TOKEN_AVAILABLE)
effect, and timeout, if enabled, is set. See accessTokenUnavailableTimeout
at create method for more details.
See available properties of the authApi
object.
import { authApi } from 'Config/antonio';
async function fetchPost(postId) {
const response = await authApi.get(`/posts/${postId}`);
return response.data;
}
Shared defaults
Even though api
and authApi
are created as separated axios instances, they share the same default request config object - api.defaults
and authApi.defaults
. This issue/feature is caused by how axios is implemented and @ackee/antonio
won't change it. Just don't be surprised, when you see the Authorization
header also in requests created by the api
.
API
create(axiosRequestConfig: Object, customConfig: Object) => httpClient:Object
This method receives two objects as arguments.
-
axiosRequestConfig: Object
The axiosRequestConfig
is reserved for axios default request configuration, see available options.
-
customConfig: Object
The customConfig
object offers following default options:
{
manageAuthHeader: true,
setAuthHeader(headers, accessToken) {
if (accessToken) {
headers.common.Authorization = `Bearer ${accessToken}`;
} else {
delete headers.common.Authorization;
}
},
accessTokenUnavailableTimeout: {
enabled: false,
duration: 1000 * 30,
silent: false,
},
}
And returns:
Example
import * as Antonio from '@ackee/antonio';
const { authApi } = Antonio.create(
{
baseURL: 'https://jsonplaceholder.typicode.com/',
},
{
setAuthHeader(headers, accessToken) {
if (accessToken) {
headers.common.Authorization = accessToken;
} else {
delete headers.common.Authorization;
}
},
},
);
async function fetchTodo() {
const response = await authApi.get('/todos/1');
return response.data;
}
Saga Effects
Custom Saga effects with built-in cancelation of API requests, see the docs.