Usando fetch com TypeScript
Como fetch
é praticamente universalmente suportado nos navegadores web mais utilizados, podemos descartar, com segurança, o uso do Axios e outras bibliotecas similares em favor do fetch
. Neste artigo, vou criar uma pequena abstração para o fetch
que adiciona algumas conveniências para melhorar a experiência do desenvolvedor.
O código
Primeiro, vou criar uma função base a partir da qual todas as outras serão derivadas:
No código acima, fizemos o seguinte:
- Criamos uma nova classe
HTTPError
, para lançar erros HTTP conforme eles ocorrem; - Utilizamos um tipo genérico para poder tipar a resposta da requisição.
Agora, vamos estender a função query
para nos permitir serializar e enviar dados em nossas requisições:
No código acima, fizemos o seguinte:
- Criamos um encerramento (closure) que, primeiramente, recebe o método que desejamos chamar e, em seguida, retorna uma função onde passamos a
url
e obody
(que, por padrão, é JSON-stringificado) da requisição.
Neste ponto, podemos usar nossas funções recém-criadas da seguinte forma:
Agora temos um código funcional, mas não muito "ergonômico". Acredito que nosso código precisa ser capar de aceitar uma URL base para todas as requisições, cabeçalhos (como um token de autorização) e um jeito mais fácil de fazer requisições do tipo PATCH
, PUT e DELETE.
Vamos refatorar o código acima, de modo que adicionar uma URL base e cabeçalhos comuns a todas as requisições:
No código acima, eu:
- Criei a função
createQuery
, um fechamento (closure), permitindo definir uma URL padrão e parâmetrosinit
predefinidos; - Criei uma nova função
query
, na qual utilizei a funçãocreateQuery
para definir a URL base e os parâmetros padrão que todas as requisições devem ter (observe a função fictíciagetToken
que adiciona um Bearer Token a cada requisição); - No final, exportei o objeto
api
com todas as funções comumente usadas para fazer requisições.
Você pode querer retornar o corpo de uma requisição que retornou um erro, por exemplo, quando o backend retorna os detalhes padronizados do problem details. Vejamos como fica o nosso código refatorado:
Agora você pode usar seu novo wrapper em torno do fetch
da seguinte forma:
Considerações finais
O código acima pode não ter todos os recursos completos de bibliotecas como Axios, redaxios, ky ou wretch, mas na maioria das vezes é tudo o que é necessário ao trabalhar com React usando SWR ou TanStack Query (tanto no frontend quanto no backend). Se quiser, dê sua opinião sobre o código e compartilhe suas melhorias. Este código está disponível neste gist.