[Desafio] - Integração com Múltiplas APIs (scatter/gather)
Published: 2022-07-16 16:36:38

> Conteúdo original [nessa thread do Twitter](https://twitter.com/zanfranceschi/status/1548344242010869763)

---

Ei, dev!

Você está prestes a aceitar o desafio mais legal de 2022! São 3 níveis de dificuldade pra todo mundo participar.

É sobre uma aplicação de cotação financeira com integração com outras APIs (que já fiz pra você com muito carinho).

cc @sseraphini

↓

![img](https://pbs.twimg.com/media/FXzS4ZcUIAIF1v4?format=png&name=small)

---

Se você estiver iniciando, seu desafio é fazer uma integração chamando uma API que devolve uma cotação fictícia. A chamada é a seguinte: 

GET /servico-a/cotacao?moeda=USD

![img](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9o36u27e6m0e4fdaplsn.png)

---

Se quiser algo mais desafiador, faça chamadas para os serviços A e B:

GET /servico-a/cotacao?moeda=USD
GET /servico-b/cotacao?curr=USD

Esses 2 serviços têm um delay proposital pra que você exercite fazer chamadas em paralelo (com promise, future, async, await, etc). De boa?

![img](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6erhbgj115tuilpjxmn.png)
 
![img](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/83wrh9ufyk9qpav0a97n.png)

---

Os serviços A e B têm retornos diferentes, tanto para chamadas inválidas (um retorna 400 e outro 422) quanto para as válidas. Afinal, são serviços diferentes. 😏

Retorne a melhor cotação dentre os dois serviços, ok?

---

Agora, se você quiser sangue mesmo 🩸, integre também com o serviço C! Ele tem um processamento assíncrono que fará um callback (webhook) para a URL que informar após terminar a cotação.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s25ma7bbxlf94rq97puj.png)

---

O maior desafio na integração com o serviço C é, a partir de um processo síncrono da sua parte (imagine você disponibilizar uma API para a melhor cotação dentre as 3), tratar o retorno assíncrono do serviço C. Use o cid (correlation id) para isso.

---

O callback do serviço C é um POST para a URL que informar com o payload como na imagem.

(obs.: se estiver usando docker + ambiente local, use os endereços "especiais" http://172.17.0.1:(porta) ou http://host.docker.internal:(porta) pro docker conseguir acessar seu ambiente).

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ponrlhbn8rmobvl73lw.png)

---

Bom, você tem algumas opções para rodar essas APIs que fiz pra você:

- Via docker (que é o mais simples); ou
- Baixar e executar o código hospedado no github.

(Essas 3 APIs, na verdade são apenas um codebase/imagem com 3 endpoints representando cada serviço.)
 
---

Docker:

A imagem docker para esse desafio está disponível no dockerhub e pra sair usando é só executar:

docker run --rm -p 8080:80 zanfranceschi/desafio-01-cotacoes

https://hub.docker.com/repository/docker/zanfranceschi/desafio-01-cotacoes

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k1zz897amz3vrl90l0ng.png)

---

Código fonte:

Se quiser executar localmente, fazer modificações, etc, está tudo disponível no github.

https://github.com/zanfranceschi/desafio-01-cotacoes

---

Seria muito top se você criasse um repositório git com a sua integração! E claro, como sempre, faça do jeito que você quiser ─ o importante é sempre aprender se divertindo!

Muito obrigado se leu até aqui! Se curtiu essa desafio, dá um RT no primeiro tweet, like e comenta!