Pular para o conteúdo
Ramos da Informática - Comunidade de Desenvolvedores

Torne-se um desenvolvedor FullStack: Pacote completo de formação desenvolvedor Frontend e Backend utilizando as linguagens de programação e frameworks mais procurados no mercado de trabalho. Mais informações, aqui. Faça o download do E-BookGuia Completo Para Se Tornar um(a) Desenvolvedor(a) Full-Stack, Começando do ZERO”.

Engenheiro de Software, autor de livros sobe tecnologia e negócios. É mantenedor do site Ramos da Informática. Hobbies: investir em ações, natação e finanças.

Engenheiro de Software, autor de livros sobe tecnologia e negócios. É mantenedor do site Ramos da Informática. Hobbies: investir em ações, natação e finanças.

admin

Todos os artigos deste autor

Trabalhando com Fetch API e XMLHttpRequest

Chatbots com Whatsapp e Cielo integrados Nesse curso, eu vou te mostrar como o consumidor poder realizar um pagamento por dentro do aplicativo do WhatsApp, aonde o seu cliente vai entrar numa conversa como entraria numa conversa com qualquer pessoa ou com a sua empresa, navegar entre os produtos/serviços em menus simples enviados pelo chatbot, adicionar esses produtos/serviços no carrinho de compras, e num determinado ponto do chat, um link exclusivo é enviado para o cliente preencher os dados do cartão de crédito. No final, a análise é devolvida para o Whatsapp no qual a conversa foi iniciada. Inscreva-se.

Nesse post vamos trabalhar com duas opções para realizar requisições assíncronas a dados no servidor XMLHttpRequest e Fetch API. Com a popularização do jQuery por muito tempo utilizamos a biblioteca para fazer requisições AJAX pela facilidade, melhorias com recursos extras e o suporte aos browsers antigos.

Mas temos um recurso antigo que nos permite realizar requisições ao servidor com Vanilla JavaScript, o XMLHttpRequest.

XMLHttpRequest

XMLHttpRequest é um objeto XHR para interação com servidores. Com ele podemos requisitar dados sem realizar o reload de todo conteúdo, para você que está programando agora isso pode parecer básico, mas não era possível no começo da web.

Suporte XMLHttpRequest API

Com a popularização do AJAX o XMLHttpRequest foi utilizado como recurso base para o conceito. O nome sugere que a API é focada em XML, mas elas podem resgatar qualquer tipo de dado.

Utilizando XMLHttpRequest

Para esse exemplo iremos fazer uma requisição a um arquivo no nosso projeto:

function onLoadRequest(event) {
console.log(this.responseText);
}

const oRequest = new XMLHttpRequest();
oRequest.addEventListener(‘load’, onLoadRequest);
oRequest.open(‘GET’, ‘/dados.json’);
oRequest.send();

Code language: JavaScript (javascript)

No código acima criamos um objeto XMLHttRequest, onde adicionamos um listener para ouvir quando a requisição for lida. Assim abrimos uma requisição do tipo GET para arquivo dados.json no nosso projeto. E por fim enviamos a requisição com o método “send”

Por padrão essa requisição será assíncrona, isso significa que a execução do código continuará sendo executada e quando os dados forem recebidos a função de callback onLoadRequest será executada.

Tratando as resposta

Temos diversos tipos de atributos de respostas a requisição os principais são responseXML e responseText no exemplo anterior tratamos o responseText.

responseXML: é utilizado para tratar requisições feitas para arquivos XML, nesse tipo de requisição podemos trabalhar de quatro formas com: XPath, Parsing e serialização de XML, XMLSerializer e expressões regulares.

responseText: se você deseja ler conteúdo de texto ou de uma página web e injetar na sua página Web, esse é o caminho. Atualmente é o formato mais utilizado na web.

Monitorando o processo

No código anterior, adicionamos um listener para o evento de load, mas temos a opção de trabalhar com 5 eventos:

progresserrorabortloadloadend(abort, load ou error)

// evento disparado quando a requisição for completa
function onLoadRequest(event) {
console.log(this.responseText);
}

// evento disparado quando o download do arquivo tem uma progressão
function onProgressRequest (oEvent) {
if (oEvent.lengthComputable) {
let percentComplete = oEvent.loaded / oEvent.total * 100;
console.log(‘Percentagem:’, percentComplete + ‘%’)
} else {
console.log(‘O total do arquivo é desconhecido’);
}
}

const oRequest = new XMLHttpRequest();
oRequest.addEventListener(‘load’, onLoadRequest);
oRequest.addEventListener(‘progress’, onProgressRequest)
oRequest.open(‘GET’, ‘/dados.json’);
oRequest.send();

Code language: JavaScript (javascript)

Caso algo de errado aconteça podemos realizar uma verificação para realizar um tratamento. Assim vamos adicionar uma condicional no nosso código:

function onLoadRequest(event) {
if(this.status === 200) {
console.log(this.responseText)
} else {
console.log(‘Somthing wrong happen:’,this.status);
}
}

Code language: JavaScript (javascript)

No código acima verificamos se o status da requisição é 200(sucesso) caso contrário exibimos o status, dai temos uma várias possibilidades: 404, 401, 500…

Fetch API

Fetch API é uma melhoria sobre a XMLHttpRequest. Ela traz a possibilidade de trabalhar com interface para administrar as requisições de recursos na rede, anteriormente tínhamos XMLHttpRequest para acompanhar requisições na rede, mas era uma API bem limitada comparada com as necessidades das aplicações modernas que temos hoje em dia. Por outro lado, a sua desvantagem que ela está presente apenas nos browsers modernos.

Suporte do browsers para Fetch API

Principal diferença que agora com Fetch Api podemos ter objetos específicos para requisições(Request) e repostas(Response). Isso permite que elas sejam utilizadas em diferentes situações como, por exemplo, Service Workers e Cache API.

Ela também fornece uma definição para conceitos relacionados, como CORS e semântica de cabeçalhos HTTP.

Utilizando fetch API

Para realizar uma requisição com fetch API, chamamos o método fetch() presente no Window ou em um Worker global. O método tem como parâmetro obrigatório o caminho do arquivo ao qual desejamos requisitar. Agora vamos para um exemplo simples com fetch API:

fetch(‘/dados.json’)
.then((response) => console.log(response));

Code language: JavaScript (javascript)

Primeira diferença, é a quantidade de linhas que escrevemos, também a opção de se trabalhar com Promises. No caso acima realizamos uma requisição para o mesmo endereço caso sucesso exibimos no nosso console o tipo de resposta que será seguinte, um objeto do tipo Response com as seguintes informações:

body: (…)
bodyUsed: false
headers: Headers
__proto__: Headers
ok: true
redirected: false
status: 200
statusText: “OK”
type: “basic”
url: “http://127.0.0.1:5500/dados.json”

Code language: HTTP (http)

Com podemos ver temos o corpo de nossa resposta que terá:

O nosso conteúdoStatus da requisição e do conteúdoInformações sobre redirecionamentoTipo da requisiçãoCabeçalho da requisição

Se compararmos como XMLHttpRequest as informações serão as seguinte:

onabort: null
onerror: null
onload: null
onloadend: null
onloadstart: null
onprogress: null
onreadystatechange: null
ontimeout: null
readyState: 4
response: “{↵ “name“:”fellyph“,↵ “sobrenome“: “cintra“,↵ “blog“: “https://blog.fellyph.com.br”↵}”
responseText: “{↵ “name“:”fellyph“,↵ “sobrenome“: “cintra“,↵ “blog“: “https://blog.fellyph.com.br”↵}”
responseType: “”
responseURL: “http://127.0.0.1:5500/dados.json”
responseXML: null
status: 200
statusText: “OK”
timeout: 0
upload: XMLHttpRequestUpload {onloadstart: null, onprogress: null, onabort: null, onerror: null, onload: null, …}
withCredentials: false

Code language: JavaScript (javascript)

Como podemos ver temos a informações de requisições, respostas e eventos tudo num lugar só, isso dificulta o tratamento da informação e realiza um consumo de dados desnecessário para o usuário.

Na requisição anterior caso queiramos tratar os dados da resposta fazemos da seguinte forma:

fetch(‘/dados.json’)
.then(response => response.json())
.then(data => console.log(data));

Code language: JavaScript (javascript)

Para o tratamento de erros realizamos da seguinte forma, adicionamos um catch na chamada de nosso catch:

fetch(‘/dados.json’)
.then(response => response.json())
.then(data => console.log(data));
.catch(error => {
console.log(‘Algo de errado aconteceu:’, error )
});

Code language: JavaScript (javascript)

Tipos de requisição

A fetch api pode realizar requisições para diferentes tipos de dados, como texto, images, como processar arquivos de text linha a linha. Além disso podemos enviar informações e realizar upload de arquivos.

Um exemplo de um envio de um arquivo json:

const data = {
name: ‘fellyph’,
sobrenome: ‘cintra’,
blog: ‘https://blog.fellyph.com.br’
};

fetch(‘/usuario’, {
method: ‘POST’, // ou ‘PUT’
headers: {
‘Content-Type’: ‘application/json’,
},
body: JSON.stringify(data),
})
.then(response => response.json())
.then(data => {
console.log(‘Success:’, data);
})
.catch((error) => {
console.error(‘Error:’, error);
});

Code language: JavaScript (javascript)

Suporte

Fetch API é suportada por 95% dos browsers, os browsers que não possuem suporte:

Internet Explorer 11 Edge 13 e inferior

Podemos verificar o suporte da seguinte forma:

if (window.fetch) {
// realizamos o request com fetch
} else {
// utilizamos um fallback
}

Code language: JavaScript (javascript)

XMLHttpRequest vs. Fetch API

Eles surgiram em tempos diferentes, por muito tempo XMLHttpRequest deu conta do recado mas com a evolução das aplicações web começamos a ter a necessidade de multiplas requisições, foi que então começamos a ter problemas com correntes de callbacks requisições a diferentes serviços.

Para solucionar esse problema tivemos a introdução de promises e junto a ela tivemos a inclusão de novas APIs que começaram a utilizar esse recurso como Fetch API, Service Worker entre outras Web APIs.

Podemos dizer que Fetch API é a evolução da XMLHttpRequest. Apesar da estrutura ter mudado drasticamente elas possuem o mesmo objetivo solucionar o problema com requisições assíncronas. Além de ser extremamente poderosa.

Para mais tutoriais sobre desenvolvimento web acesse a página da categoria tutoriais.

Este artigo foi importado automaticamente por fazer parte do Planetário Dev. Quer fazer parte deste HUB de conteúdos? Faça parte do Planetário e veja as vantagens.

Não tem site ou blog? Seja um autor do site e ainda pode ser remunerado.

Mais sobre Newsletters?

32 melhores newsletters sobre negócios, startups e tecnologia para assinar em 2022

Leia também:

Facebook
LinkedIn
Twitter
Pinterest
Reddit
Telegram
WhatsApp
Email
Print

Relacionados

Deixe uma resposta