---
# System prepended metadata

title: Criando uma mock API com Mocky.io e utilizando o asyncData para requisição de dados HTTP

---

# Criando uma mock API com Mocky.io e utilizando o asyncData para requisição de dados HTTP

### O que você irá encontrar neste catálogo:
- [O que é um mock API e para que usá-lo](#O-que-%C3%A9-um-mock-API-e-para-que-us%C3%A1-lo)
- [Configurando o Mocky](#Configurando-o-Mocky)
- [Usando o Fetch](#Usando-o-Fetch)
- [O que é asyncData](#O-que-é-asyncData)
- [Axios X Fetch](#Axios-X-Fetch)

---

### O que é uma mock API e para que usá-la
Durante o desenvolvimento do frontend por conta de atrasos no backend, não é possível continuar certas funcionalidades mais dinâmicas, como renderizar uma lista de objetos que viriam do servidor, para que o desenvolvimento não pare, é possível criar um mock (uma imitação) do servidor e simular o seu retorno. </br>
Algumas opções para criar esse mock são:
- [Mocky](https://designer.mocky.io/) 
- [JSON Server](https://github.com/typicode/json-server) 
- [MockApi](https://mockapi.io/)
- [Mirage.js](https://miragejs.com/) 

Neste catálogo utilizaremos o **Mocky**, pois é um dos mais simples e rápidos de configurar.

---

### Configurando o Mocky
    
- Acesse o site [Mocky Design](https://designer.mocky.io/design);
- Lá você terá várias opções para configurar o seu mock, como: HTTP status, o tipo de conteúdo da resposta, os headers e o response body;
- No **HTTP Status** você pode escolher o código HTTP de resposta, como: 200 para uma ação de busca realizada com sucesso, ou até mesmo simular um erro no servidor com o código 500;
- Em **Response Content Type** você pode escolher o qual o tipo do conteúdo que a resposta irá retornar, como: application/json para retornar um json, ou multipart/form-data para retornar a resposta de um formulário;
- No **Charset** você pode escolher o encode da resposta;
- Em **HTTP Headers** você pode definir o header da resposta;
- Em **HTTP Respose Body** você pode definir a o corpo da resposta em si, **nessa parte é bom prestar atenção com a formatação do JSON, pois o Mocky não sinaliza caso o JSON esteja mal estruturado.**

**Exemplo:**

![](https://i.imgur.com/nFelUUW.png)

Após configurar a sua HTTP Response o Mocky retornará a URL que você utilizará no asyncData para fazer a requisição. (Exemplo de URL: `https://run.mocky.io/v4/ec0d7c68-3146-4b4d-9bb4-3d6604c9bcf6`);

---

### Usando o Fetch
 
Você pode fazer chamadas simples às APIs com a ferramenta chamada fetch(). Para fazer uma solicitação GET simples com fetch, é preciso apenas passar o URL do endpoint como argumento. 

O método fetch, se definido no asyncData, é sempre chamado antes de carregar o componente.

```
fetch('https://run.mocky.io/v3/93704155-f209-493d-96e2-79c566b8bd88')
    .then((data) => data.json())
    .then((res) => console.log(res))
```

---

### O que é asyncData 
O Nuxt.js adiciona ao projeto Vue um método chamado **asyncData** que permite lidar com operações assíncronas antes de definir os dados do componente.

O **asyncData** é chamado sempre antes de carregar o componente (apenas para componentes da página). Ele pode ser chamado do lado do servidor ou antes de navegar para a rota correspondente.

Este método recebe o objeto de contexto como o primeiro argumento, você pode usá-lo para buscar alguns dados e retornar os dados do componente.

Ao retornar o objeto, o Nuxt.js mesclará automaticamente com os dados do componente.
Por exemplo: 
```
async asyncData() {
    const dados = await fetch('https://run.mocky.io/v3/93704155-f209-493d-96e2-79c566b8bd88')
    .then((data) => data.json())
    .then((res) => console.log(res)) 
    
    return {
        variavelDoData: dados
    }
}
```

OBS: Você NÃO tem acesso à instância do componente por meio de "this" dentro de asyncData porque ele é chamado antes de inicializar o componente.

---

### Axios X Fetch

```
// Usando o axios

 async data(){
    let { data } = await axios.get(`http://jsonplaceholder/`)
    return { posts: data }
}

// OU

async asyncData({ $axios }) {
    const ip = await $axios.$get('http://icanhazip.com') 
    return { ip } //retorna os dados em uma variável chamada "ip" 
}

// OU AINDA

async asyncData({ $axios }) {
    const [empresasRes, clientesRes] = await Promise.all([
    $axios.get('/Empresas'),
    $axios.get('/Clientes')
    ])
    return {
      empresas: empresasRes.data.dados,
      donos: clientesRes.data.dados
    }
}

```

o Axios stringuifica (stringifies) automaticamente os dados enviados nas requests (você também pode sobrescrever o comportamento padrão e criar um meio de transformar o dado). Quando usamos fetch() você precisa fazer isso manualmente (com o .then, como visto anteriormente).




> FONTES: 
> https://pt.quish.tv/difference-between-asyncdata-vs-fetch
> https://nuxtjs.ir/guide/async-data

