Fetch API wrapper with the extended functionality and simple interface.
yarn add @distributedlab/fetcher
ECMAScript modules:
import { Fetcher } from '@distributedlab/fetcher'
CommonJS:
const { Fetcher } = require('@distributedlab/fetcher')
Via CDN:
In HTML:
<script src='https://unpkg.com/@distributedlab/fetcher'></script>
In code:
const api = new DL_fetcher.Fetcher({
baseUrl: 'https://api.example.com',
})
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
headers: {
'Content-Type': 'application/json',
},
mode: 'cors',
timeout: 10000,
credentials: 'include',
referrerPolicy: 'no-referrer',
})
// Override request headers for one request via request options argument:
const { data } = await api.get<{ name: string }>('/data', {}, {
headers: {
'Content-Type': 'text/html',
},
})
GET request:
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
})
const getData = async () => {
const { data } = await api.get<{ name: string }>('/data')
return data
}
GET request with the query params:
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
})
const getDataWithQuery = async () => {
const { data } = await api.get<{ name: string }>('/data', {
query: {
filter: "John",
exists: true,
"page[number]": 1,
include: ["comments", "posts"],
}
})
return data
}
POST request (PUT, PATCH request has pretty much the same interface, just use put or patch
method instead of post):
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
})
const postData = async () => {
const { data } = await api.post<{ name: string }>('/data', {
body: {
name: "John",
}
})
return data
}
Posting the FormData:
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
})
const postFormData = async () => {
const formData = new FormData()
formData.append('name', 'John')
formData.append('age', '25')
const { data } = await api.post<{ name: string, age: string }>('/data', { body: formData })
return data
}
Abort the request:
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
})
const abortRequest = async () => {
const requestId = api.createRequestId()
setTimeout(() => {
api.abort(requestId)
}, 1000)
const { data } = await api.get<{ name: string }>('/data', {
id: requestId,
})
}
Using the interceptors:
import { Fetcher } from '@distributedlab/fetcher'
const api = new Fetcher({
baseUrl: 'https://api.example.com',
})
api.addInterceptor({
request: async request => {
// Do something before request is sent
return { ...request, url: `${request.url}?foo=bar` }
},
response: async response => {
// Do something with response
if (response.ok) {
return response
}
return api.get('/auth/refresh')
},
error: async response => {
// Do something if response errored
if (response.status === 401) {
return api.get('/auth/refresh')
}
return response
},
})
The Fetcher standalone feature offers the convenience of making requests to an external API without
the need to create an instance or configure options such as baseUrl. It proves particularly useful
in scenarios where you require a one-time request and prefers to avoid the overhead of setting up a
Fetcher instance:
import { fetcher } from '@distributedlab/fetcher'
const getData = async () => {
const { data } = await fetcher.get<{ name: string }>('https://api.example.com/data')
console.log(data) // { name: 'John' }
}
For the change log, see CHANGELOG.md.
Generated using TypeDoc