On the browser I generally use fetch(). It's a bit weird at first but it's easy to write a thin wrapper if the default behavior doesn't make sense. Eg: throwing when you receive a 400 or 500.
On Node I've been using this lately: https://github.com/node-fetch/node-fetch