Recentemente eu tive que decidir qual tecnologia iria utilizar em um grande projeto Javascript para fazer chamadas AJAX. Se você estiver usando JavaScript, terá diferentes maneiras de fazer requests ao server-side.
A alguns anos atras, já existia alguns meio para extrair dados de um servidor sem a necessidade de atualização de página, mas eles geralmente contavam com técnicas estranhas. A Microsoft desenvolveu o XMLHttpRequest
como uma alternativa de navegação para o seu leitor de emails Outlook, e só se tornou um padrão da web em 2006.
A Fetch API
foi introduzida em 2015 com o ES6. As interfaces genéricas de Request
e Response
fornecem consistência, enquanto as Promises permite o encadeamento fácil sem a utilização de callbacks. O Fetch
é limpo, elegante e simples de entender, mas existem outras boas alternativas e as veremos brevemente neste artigo.
Para simplificar, vou me concentrar no que são, suas sintaxes e alguns prós e contras de cada alternativa.
A seguir mostro os exemplos básicos de Requests GET e POST usando diferentes alternativas. Vamos começar então.
O objeto XMLHttpRequest
pode ser usado para requisitar dados de um servidor da web. É o método mais antigo dessa comparação e, embora outras opções o superem, ainda é válido e útil por sua compatibilidade com versões anteriores e maturidade.
GET
var req = new XMLHttpRequest();
// A propriedade onreadystatechange especifica uma function
// que sera invocada toda vez que o status
// de XMLHttpRequest altera
req.onreadystatechange = function() {
// this.readyState = 4 significa concluido
if (this.readyState == 4 && this.status == 200) {
// responseText contem uma string
console.log(xhttp.responseText)
// faca alguma coisa
}
};
req.open("GET", '/url', true);
req.send();
POST
var formData = new FormData();
formData.append("email", "email@email.com");
var req = new XMLHttpRequest();
req.onreadystatechange = function() {}
req.open("POST", '/url');
req.send(formData);
Pros
Contras
Referências
O JQuery é uma biblioteca amplamente usada até pouco tempo atrás e permitia requisições assíncronas de HTTP (AJAX).
Todos os métodos Ajax do jQuery retornam um superconjunto do objeto XMLHTTPRequest
GET
$.ajax({
url: '/url'
}).done(function(data) {
// todo
}).fail(function() {
// error handler
});
POST
$.ajax({
type: "POST",
url: '/url',
data: data,
success: successCallBack,
error: errorCallBack,
dataType: dataType
});
Pros
Contras
Referências
Qwest is a simple ajax library based on promises, and that supports XmlHttpRequest2 unique data like ArrayBuffer, Blob, and FormData.
GET
qwest.get('/url')
.then(function(xhr, response) {
// fazer algo com os dados
});
POST
qwest.post('/url', {
email: 'email@email.com',
idade: 30
})
.then(function(xhr, response) {
// fazer alguma coisa
})
.catch(function(e, xhr, response) {
// processar o erro
});
Pros
Contras
Referências
SuperAgent é uma API ajax criada para flexibilidade, legibilidade e com uma baixa curva de aprendizado. Também funciona com o Node.js.
GET
request('GET', '/url')
.then(success, failure);
O método query()
aceita objetos que, quando usados com o método GET, formarão uma query string. No exemplo a seguir será produzido a URL /url?name=bob&lastName=oliver&order=desc
.
request
.get('/url')
.query({ name: 'bob' })
.query({ lastname: 'oliver' })
.query({ order: 'desc' })
.then(res => {
console.log(res)
});
POST
request
.post('/url')
.send({ name: 'bob' })
.set('Accept', 'application/json')
.then(res => {
console.log('result' + JSON.stringify(res.body));
});
Pros
request.abort()
;Contras
Referências
Http-client permite você compor requisições HTTP utilizando a API Javascript Fetch.
GET
//using ES6 modules
import { createFetch, base, accept, parse } from 'http-client'
const fetch = createFetch(
base('/url'),
accept('application/json'),
parse('json')
)
fetch('/url').then(response => {
console.log(response.jsonData)
})
POST
//using ES6 modules
import { createFetch, method, params } from 'http-client'
const fetch = createFetch(
params({ email: 'email@email.com' }),
base('/url')
)
Pros
Contras
Referências
Biblioteca HTTP baseada em Promises para realizar HTTP requests no navegador e Node.js.
GET
axios({
url: '/url',
method: 'get'
})
POST
axios.post('/url', {
email: 'email@email.com'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Pros
Contras
Referências
Fetch é uma API nativa dos navegadores para fazer requests pela rede mundial e substitui nativamente o XMLHttpRequest. Esta API utiliza Promises, o que evita o callback hell causado pelo uso do XMLHttpRequest.
GET
//With ES6 fetch
fetch('/url')
.then(data => {
// ...do some stuff whith data
}).catch(error => {
// Handle error
});
POST
fetch('/url', {
method: 'post',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify({name: 'Murdock'})
}).then(res=>res.json())
.then(res => console.log(res));
// ou com ES2017
(async () => {
const response = await fetch('/url', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({name:'Cooper'})
});
const result = await response.json();
console.log(result);
})();
Pros
Contras
.json()
. No Axios, você obtém o objeto JSON por padrão;{ credentials: 'same-origin' }
.Referências
Fetch API é um novo padrão e é suportado pelas novas versões do Chrome e Firefox sem usar nenhuma biblioteca adicional.
Recomenda-se dedicar algum tempo para examinar as características do Axios, SuperAgent ou o restante das bibliotecas, pois todas possuem documentação adequada, são fáceis de usar e sua curva de aprendizado não é muito grande. Para algumas situações, elas oferecem recursos que o Fetch API não oferece.
No meu caso, prefiro o Fetch porque não preciso de recursos especiais, e o Fetch é nativo no JavaScript e suficiente para a maioria dos projetos.