fetchConjunto de regras bem definidas descrevendo como entidades se comunicam.
Requisição:
GET /index.html HTTP/1.1
Host: www.twitter.com
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Content-Type: text/html; charset=UTF-8
Content-Length: 131
<!DOCTYPE html>
<html>
<head>
<title>Twitter</title>
</head>
<body>
Olá mundo, este é um tweet.
</body>
</html>
:globe_with_meridians: Exemplo do Fumaceiro
XMLHttpRequest)
XMLHttpRequest (antigão)XMLHttpRequest. Exemplo do Twitter:
let requisicao = new XMLHttpRequest();
requisicao.onreadystatechange = callbackMaisTweets;
requisicao.responseType = 'json';
requisicao.open('GET', '/tweets/pagina/5');
requisicao.send();
onreadystatechange) é invocada a cada mudança
de estado da requisição (veja nos próximos 2 slides)function callbackMaisTweets() {
if (requisicao.readyState === 4) { // 4: DONE (resp. recebida)
if (requisicao.status === 200) { // 200: código Ok do HTTP
// a resposta chegou e foi um arquivo
// .json com um array de tweets:
let novosTweets = requisicao.response.arrayComNovosTweets;
novosTweets.forEach(colocaTweetNaPagina);
} else {
console.log('Erro ao carregar mais tweets. Código HTTP: '
+ requisicao.status);
}
}
}
XMLHttpRequest{
"quantidade": 20,
"arrayComNovosTweets": [
{
"autor": "Sensacionalista",
"texto": "Grupo de pessoas que sabem tudo
cria novo grupo: Vegetarianos
pró carne mal passada",
"curtidas": 2
} /* mais 19 tweets aqui... */
]
}
XMLHttpRequest0 UNSENT
.. open() ainda não foi invocado
1 OPENED
.. send() ainda não foi invocado
2 HEADERS_RECEIVED
.. send() foi invocado e os cabeçalhos da resposta
já estão disponíveis (chegaram)
3 LOADING
.. fazendo download da resposta
4 DONE
.. operação finalizada
DONE
// no clique, faz um Ajax para pegar o xcom-reviews.json
showReviewsEl.addEventListener('click', () => {
let requisicao = new XMLHttpRequest();
requisicao.open('GET', 'xcom-reviews.json');
requisicao.responseType = 'json';
requisicao.onreadystatechange = () => {
// chegando a resposta, põe as avaliações na página
if (requisicao.readyState === 4) {
if (requisicao.status === 200) {
// a resposta é um objeto js que tem 'avaliacoes'
let avaliacoes = requisicao.response.avaliacoes;
reviewsEl.innerHTML = '';
avaliacoes.forEach(criaAvaliacaoNaPagina);
}
}
}
requisicao.send();
});
{
"avaliacoes": [
{
"autor": "Astolfo Lombardi",
"recomenda": true,
"comentario": "Um jogo de ETs sinistrões",
"curtidas": 18
},
{
"autor": "Eymael Fortunato",
"recomenda": true,
"comentario": "Rola uma parada sadia entre
humanos e aliens neste jogo #sqn",
"curtidas": 7
} /* ...+2 avaliações */
]
}
XMLHttpRequest para facilitar a
realização de requisições Ajax. Exemplo:
$.ajax({
url: '/tweets/pagina/5',
dataType: 'json',
success: function(resposta) {
let novosTweets = resposta.arrayComNovosTweets;
novosTweets.forEach(colocaTweetNaPagina);
}
});
$.getJSON({...}), equivalente a
$.ajax({...}) com o dataType: 'json'$('#show-reviews').click(() => {
$.ajax({
url: 'xcom-reviews.json',
dataType: 'json',
success: resposta => {
// a resposta é um objeto js que contém uma propriedade avaliacoes
let avaliacoes = resposta.avaliacoes;
// limpamos a <div id="reviews">...</div>
$reviews.empty();
// percorremos as avaliacoes, colocando elementos na página
avaliacoes.forEach(criaAvaliacaoNaPagina);
}
});
});
fetch(...) Promessa: algo que pode dar certo, ou errado.
fetch(url, opcoes)
.then(callbackSucesso)
.catch(callbackErro);
showReviewsEl.addEventListener('click', () => {
fetch('xcom-reviews.json') // retorna uma *promessa*
.then(respostaBruta => respostaBruta.json()) // arrow function
.then(resposta => {
// a resposta é um objeto js que contém uma propriedade avaliacoes
let avaliacoes = resposta.avaliacoes;
reviewsEl.innerHTML = '';
avaliacoes.forEach(criaAvaliacaoNaPagina);
});
});
});
https://swapi.dev/api/films/1/ como a URL$ python -m SimpleHTTPServer
$ python -m http.server 8000