Чтение метаданных ответа

fetch("https://httpbin.org/json").then((response) => {
  console.log(response.status);
  console.log(response.statusText);
  console.log(response.headers.get("Content-Type"));
  console.log(response.headers.get("Date"));
});

Чтение текста ответа

fetch("https://httpbin.org/html")
  .then((response) => response.text())
  .then((data) => console.log(data));

Чтение json ответа

fetch("https://httpbin.org/json", {
  headers: {
    Accept: "application/json",
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((ex) => console.log("parsing failed", ex));

Отправка json

fetch("https://httpbin.org/post", {
  method: "POST",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json; charset=UTF-8",
  },
  body: JSON.stringify({ k: "v" }),
});

Отправка формы (multipart/form-data)

const form = document.querySelector("form");

fetch("https://httpbin.org/post", {
  method: "POST",
  body: new FormData(form),
});

Отправка формы (application/x-www-form-urlencoded) вариант 1

fetch("https://httpbin.org/post", {
  method: "POST",
  body: new URLSearchParams({ k1: "v1", k2: "v2" }),
});

Отправка формы (application/x-www-form-urlencoded) вариант 2

fetch("https://httpbin.org/post", {
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
  },
  body: "k1=v1&k2=v2",
  // body: qs.stringify({ k1: "v1", k2: "v2" })
});

Отправка отдельного файла из формы

const input = document.querySelector('input[type="file"]');
const data = new FormData();
data.append("file", input.files[0]);

fetch("https://httpbin.org/post", {
  method: "POST",
  body: data,
});

Отправка файла, созданного на лету

const file = new Blog(["Проверка"], { type: "text/plain" });
const data = new FormData();
data.append("file", file, "hello.txt");

fetch("https://httpbin.org/post", {
  method: "POST",
  body: data,
});

Отправка cookies

Если нужна отправка cookies, то лучше не полагаться на значение по умолчанию, а явно указывать credentials: "same-origin" (либо include при CORS запросах). Поскольку в предыдущих версиях спецификации fetch значением по умолчанию было omit, а не same-origin.

fetch("https://httpbin.org/post", {
  method: "POST",
  credentials: "same-origin",
  body: data,
});

Basic авторизация

function base64(str) {
  if (Buffer && Buffer.from) {
    return Buffer.from(username + ":" + password).toString("base64");
  } else if (btoa) {
    return btoa(str);
  } else {
    throw new Error("");
  }
}

fetch("https://httpbin.org/basic-auth/user/passwd", {
  headers: {
    Authorization: "Basic " + base64("user:passwd"),
  },
});

Отмена запроса

const abortController = new AbortController();

fetch("https://httpbin.org/", {
  signal: abortController.signal,
}).catch((err) => {
  if (err.name == "AbortError") {
    console.log("Aborted!", err);
  } else {
    throw err;
  }
});

setTimeout(() => abortController.abort(), 0);

Обработка http статусов ответа

У fetch есть особенность, из-за которой он не генерирует ошибку в зависимости от http статуса ответа. Это поведение можно изменить, например, таким сопособом.

function checkResponseStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  } else {
    const error = new Error(response.statusText);
    error.response = response;
    throw error;
  }
}

fetch("https://httpbin.org/json")
  .then(checkResponseStatus)
  .then((res) => res.json())
  .then((data) => console.log("request succeeded with JSON response", data))
  .catch((error) => console.log("request failed", error));