theme | title | drawings | transition | mdc | colorSchema | aspectRatio | themeConfig | plantUmlServer | layout | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|
default |
Arquitetura Front-end orientada a Dados |
|
slide-left |
true |
dark |
16/9 |
|
cover |
{
"name": "Paulo Cândido",
"professional": [
"Senior Frontend Develiper no CPQD",
"Organizador do Front in Campinas",
"Membro da Liga voluntária do MWPT"
],
"technologies": [
"React", "Vue", "Typescript", "3D Maps", "Progressive Web Apps"
],
"likes": [
"Animes", "Séries", "The Office", "Musician"
]
}
- A API nunca está pronta quando começamos o frontend;
- Mock, o salvador da pátria;
- Miragem, uma forma de resolver o problema;
- Arquitetura voltada a mutação de dados;
- Isolando serviços;
- Isolando chamada de API;
- Mock com types;
Ou API existe e precisamos construir uma interface para interagir com ela, ou (o que é mais comum) a API e Interface serão construídas ao mesmo tempo.
Criar um serviço que retorna os usuários
export const ENDPOINTS = {
USER: "/api/users"
}
const UserService = {
findAll: (): User[] => {
const response = await fetch(ENDPOINTS.USER);
const data = await response.json();
return data;
},
}
Cria um JSON para o mock, o que é bastante interessante
{
"users": [
{
"id": 1,
"username": "anakin",
"email": "anakin@example.com"
},
{
"id": 2,
"username": "padme",
"email": "padme@example.com"
},
{
"id": 2,
"username": "kenobi ",
"email": "kenobi @example.com"
}
]
}
Os devs colocam um retorno direto substituindo a chamada do serviço
import UsersJson from './mock/users.json';
const MOCK_ACTIVE = true; // define se o mock será aplicado ou não
export const ENDPOINTS = {
USER: "/api/users"
}
const UserService = {
findAll: (): User[] => {
if(MOCK_ACTIVE) {
return UsersJson.users;
}
const response = await fetch(ENDPOINTS.USER);
const data = await response.json();
return data;
},
}
import UsersJson from './mock/users.json';
const MOCK_ACTIVE = true;
export const ENDPOINTS = {
USER: "/api/users"
}
const UserService = {
findAll: (): User[] => {
if(MOCK_ACTIVE) {
return UsersJson.users;
}
const response = await fetch(ENDPOINTS.USER);
const data = await response.json();
return data;
},
}
antes
::right::
import ApiServices from 'services/ApiServices';
export const ENDPOINTS = {
USER: "/api/users"
}
const UserService = {
findAll: (): User[] => {
return ApiServices.find(ENDPOINTS.USER);
},
}
depois
O nascimento do API Services
const ApiServices = {
find: async (endpoint: string) => {
const response = await fetch(endpoint);
const data = await response.json();
return data;
},
create: async <T>(endpoint: string, data: T) => {
const response = await fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
const dataResponse = await response.json();
return dataResponse;
},
delete: async <T>(endpoint: string, data: T) => {
const response = await fetch(endpoint, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
const dataResponse = await response.json();
return dataResponse;
},
};
export default apiServices;
Uma dúvida cruel, por que não os isolar?
this.get("/users", (schema, request) => {
return ["Anakin", "Padme", "Kenobi"]
})
this.get('/users', () => { ... });
this.post('/users', () => { ... });
this.patch('/users/:id', () => { ... });
this.put('/users/:id', () => { ... });
this.del('/users/:id', () => { ... });
this.options('/users', () => { ... });
this.get("/users", (schema) => {
return schema.users.all()
})
this.get("/users/:id", (schema, request) => {
let id = request.params.id
return schema.users.find(id)
})
this.post("/movies", (schema, request) => {
let attrs = JSON.parse(request.requestBody)
return schema.movies.create({ attrs })
})
import UsersJson from './mock/users.json';
import { createServer } from "miragejs"
createServer({
routes() {
this.namespace = 'api';
this.get("/users", UsersJson.users);
}
})
Nada muda no nosso serviço de usuários
import ApiServices from 'services/ApiServices';
export const ENDPOINTS = {
USER: "/api/users"
}
const UserService = {
findAll: (): User[] => {
return ApiServices.get(ENDPOINTS.USER);
},
}
Nem nos serviços da API
const apiServices = {
find: async (endpoint: string) => {
const response = await fetch(endpoint);
const data = await response.json();
return data;
},
...
};
Sim, e de forma bem mais Simples