Headers: tenta imaginar que a sua requisição é uma atividade da escola, no caso o header é o cabeçalho que você faz no começo da atividade, necessariamente ela não faz parte do corpo da requisição mas ainda sim é importante. leia mais
Exemplo:
fetch('https://api.github.com/users/manishmshiva', {
method: "GET",
headers: {"Content-type": "application/json;charset=UTF-8"}
})
.then(response => response.json())
.then(json => console.log(json));
.catch(err => console.log(err));
JSON.stringify: ele é usando para converter um objeto em string, no outro lado que vai receber a requisição ele tem que usar o JSON.parse para pegar a string e converter em objeto denovo, o porquê fazer isso eu não lembro, até porque eu uso o axios e ele já faz isso por de baixo dos panos, sem ter que ficar convertendo o tempo todo.
Axios vs fetch e request: resumindo eu recomendo você a aprender o axios porque ele é basicamente uma versão melhorada dos outros dois. leia mais
caso tem algo que eu falei errado me fale, e eu também ainda não tenho conhecimento sobre proxy por isso eu não coloquei 👍