minireq
A minimal request library built on XMLHTTPRequest for the browser, and for nodejs with the same API.
Documentation on Github Pages
Why not fetch, axios or superagent
fetch
is too bare bones and also does not support features like progress indication. axios
and superagent
are neither minimal nor are they written with ES modules with makes them awkward to bundle.
Also I want a request library with better types than currently available.
Example
import { makeRequest } from '@minireq/browser';
// If you are using nodejs, you can use
// import { makeRequest } from '@minireq/node';
const request = makeRequest();
const { promise, abort } = request({
method: 'GET',
url: '/api/users',
});
// Abort on user click
document.querySelector('button.abortRequest').addEventListener('click', () => {
abort();
});
promise.then(({ status, data }) => {
if (status === 200) {
console.log(data.name);
}
});
Making a post request, with a timeout on 500ms
import { makeRequest } from '@minireq/browser';
const request = makeRequest();
const { promise } = request({
method: 'POST',
url: '/api/users',
send: {
name: 'Peter',
age: 50,
children: [],
},
timeout: 500,
});
promise.then(({ status, data }) => {
if (status === 201) {
console.log(data.id);
}
});
Using a custom content type
import { makeRequest, defaultSerializers } from '@minireq/browser';
const serializer = {
parse: (data: string) => data.split('\n').map(x => JSON.parse(x)),
convert: (data: any) => {
if (!Array.isArray(data)) {
return [JSON.stringify(data)];
} else {
return data.map(x => JSON.stringify(x)).join('\n');
}
},
};
const { request } = makeRequest({
...defaultSerializers,
'application/ndjson': serializer,
});
const { promise, abort } = request({
method: 'GET',
url: '/api/users',
accept: 'application/ndjson',
});
const { status, data } = await promise;
if (status === 200) {
console.log(data.length);
}