A Practical guide to use Fetch API


Introduction

Fetch is a promise based Javascript API for making asynchronous HTTP requests. It is a clean, simple, powerful and a flexible API to get/send data from/to a server.

A simple GET request example using Fetch API

fetch('https://jsonplaceholder.typicode.com/posts')
  .then(function(response) {
    //
  })
  .catch(function(error) {
    //
  });

The Response returned by the fetch() method contains the information about the request and the response of the network request including headers, status code, and status message. The body of Response has a few methods:

  • clone() - As the method implies this method creates a clone of the response.
  • redirect() - This method creates a new response but with a different URL.
  • arrayBuffer() - In here we return a promise that resolves with an ArrayBuffer.
  • formData() - Also returns a promise but one that resolves with FormData object.
  • blob() - This is one resolves with a Blob.
  • text() - In this case it resolves with a string.
  • json() - Lastly we have the method to that resolves the promise with JSON.
fetch('https://jsonplaceholder.typicode.com/posts')
  .then(function(response) {
    // get response headers
    console.log(response.headers.get('content-type'));

    console.log(response.headers.get('expires'));

    // HTTP response status code
    console.log(response.status);

    // shorthand for `status` between 200 and 299
    console.log(response.ok);

    // status message of the response e.g. `OK`
    console.log(response.statusText);

    // check if there was a redirect
    console.log(response.redirected);

    // get the response type (e.g., `basic`, `cors`)
    console.log(response.type);

    // the full path of the resource
    console.log(response.url);
  })
  .catch(function(error) {
    //
  });

Here is how you can use Fetch to request JSON data from server:

fetch('https://jsonplaceholder.typicode.com/posts')
  .then(function(response){
    return response.json();
  })
  .then(function(data) {
    // data here is JSON object
    console.log(data);
  })
  .catch(function(error) {
    //
  });

How to use Fetch API to send POST requests

Fetch is not just for GET requests. It can be used for all other request types like POST, PUT, PATCH, DELETE etc. Here's an example of POST type request:

fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    body: JSON.stringify({
      title: 'foo',
      body: 'bar',
      userId: 1
    })
  })
  .then(function(response){
    return response.json();
  })
  .then(function(data) {
    // data here is JSON object
  })
  .catch(function(error) {
    //
  });

Make sure you Stringify your JSON data before sending to server.

Set Headers for Fetch request

Setting up headers for your request is pretty easy. One of the easiest way is to pass a headers objects along with the request.

fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    body: JSON.stringify({
      title: 'foo',
      body: 'bar',
      userId: 1
    }),
    headers: {
      "Content-type": "application/json"
    }
  })
  .then(function(response){
    return response.json();
  })
  .then(function(data) {
    // data here is JSON object
  })
  .catch(function(error) {
    //
  });

Cookies

Fetch doesn't send cookies by default and if you need to send cookies along with the request, you will have to enable it explicitly. Here's how:

fetch('https://jsonplaceholder.typicode.com/posts', {
    credentials: 'include'
  })
  .then(function(response) {
    //
  })
  .catch(function(error) {
    //
  });

Error Handling

We can use the catch() method of the promise to intercept any error that is thrown during the execution of the request. However, no error will be thrown if the request hits the server and comes back, regardless of what response was returned by the server. The promise returned by the fetch() doesn't reject HTTP errors even if the HTTP response code is 404 or 500.

fetch('https://jsonplaceholder.typicode.com/some-invalid-path', {
    credentials: 'include'
  })
  .then(function(response) {

    if(response.ok)
    {
      return response.json();
    }

    return Promise.reject(response.status);
  })
  .catch(function(error) {
    //
    console.error(error)
  });