## **API**
significa Interface de Programação de Aplicações, em inglês, Application Programming Interface. Trata-se de um conjunto de regras e definições que permite a interação entre diferentes softwares. Em outras palavras, uma API permite que um aplicativo "converse" com outro, fornecendo uma maneira consistente e padronizada para que desenvolvedores possam acessar funcionalidades específicas de um software, serviço ou plataforma.
Uma API define os métodos e formatos de comunicação que os desenvolvedores podem usar para solicitar e enviar informações. Ela atua como uma ponte que permite que diferentes componentes de software se comuniquem de forma eficiente, facilitando a integração entre sistemas.
Em outras palavras: É basicamente um conjunto de rotinas e padrões estabalecidos por uma aplicação para que outras aplicações possa utilizar as funções daquela aplicação
**Cliente** (cliente)
**Garçom** (pedido, leva seu pedido para a cozinha e traz sua comida)(API)
**Cozinha** (server)
## **REST**
um conjunto de regras que facilitam a comunicação entre diferentes computadores na internet. A tranferência de dados, geralmente, é feita usando o protocolo HTTP. Em resumo, REST é uma maneira organizada e comum para computadores se comunicarem pela internet, tornando mais fácil para diferentes aplicativos e serviços trabalharem juntos de forma eficiente.
* **Arquitetura Cliente-Servidor:** O sistema é dividido entre o cliente, que envia as solicitações, e o servidor, que processa essas solicitações e envia as respostas.
* **Sem Estado (Stateless)**: Cada solicitação do cliente para o servidor contém todas as informações necessárias para entender e processar a solicitação. O servidor não mantém informações sobre o estado do cliente entre as solicitações.
* **Representações:** Os recursos, que são as entidades manipuladas pelos serviços REST, são representados de forma clara e consistente. Por exemplo, um recurso pode ser representado em JSON ou XML.
* **Operações bem definidas (CRUD)**: As operações comuns de CRUD (Create, Read, Update, Delete) são mapeadas para as operações HTTP correspondentes (POST, GET, PUT, DELETE).
No exemplo do garçom, o rest seria um bloquinho de notas, onde o garçom ira anotar o pedido.
## Obrigações para ser RESTFULL
### Client-Server
Dividir a aplicação em componentes cliente e do armazenamento de dados (servidor) para que eles possam evoluir independentemente. Dessa forma, poderemos ter uma portabilidade do nosso sistema, usando o react para web e react native para mobile, por exemplo.
### Stateless
Cada solicitação do cliente para o servidor contém todas as informações necessárias. O servidor não mantém informações sobre o estado do cliente entre as solicitações, por isso é necessário que em todo pedido(Request) tenha todas as informações necessárias.
### Cacheable
As respostas para uma requisição, deverão ser explícitas ao dizer se aquela requisição, pode ou não ser cacheada pelo cliente.
### Layered System:
O cliente acessa o endpoint, sem precisar saber da complexidade, de quais passos estão sendo necessários para o servidor responder a requisição, ou quais outras camadas o servidor estará lidando, para que a requisição seja respondida.
### Code on demand (opcional):
Dá a possibilidade da nossa aplicação pegar códigos, como o javascript, por exemplo, e executar no cliente.