kb.erickguedes.com
APIs: Design, Arquitetura e Implementação

Fundamentos de API e HTTP

Aula 1 de 7

O que é uma API?

API (Application Programming Interface) é um contrato entre sistemas. APIs Web expõem funcionalidades via HTTP.

Cliente → Request HTTP → API Server → Response HTTP → Cliente

HTTP Methods

MethodCRUDIdempotenteSafeBody
GETReadSimSimNão
POSTCreateNãoNãoSim
PUTReplaceSimNãoSim
PATCHPartial UpdateNão*NãoSim
DELETEDeleteSimNãoOpcional

HTTP Status Codes

1xx: Informational
├── 101: Switching Protocols (WebSocket)

2xx: Success
├── 200 OK
├── 201 Created
├── 202 Accepted   (async processing)
├── 204 No Content (DELETE bem-sucedido)

3xx: Redirection
├── 301 Moved Permanently
├── 302 Found (temporary)
├── 304 Not Modified (cache)
├── 307 Temporary Redirect (mesmo método)
├── 308 Permanent Redirect (mesmo método)

4xx: Client Error
├── 400 Bad Request
├── 401 Unauthorized
├── 403 Forbidden
├── 404 Not Found
├── 405 Method Not Allowed
├── 409 Conflict
├── 422 Unprocessable Entity (validation)
├── 429 Too Many Requests (rate limit)

5xx: Server Error
├── 500 Internal Server Error
├── 502 Bad Gateway
├── 503 Service Unavailable
├── 504 Gateway Timeout

REST — Representational State Transfer

Princípios REST (Roy Fielding):

1. Stateless: cada request contém toda info necessária
2. Cacheable: responses marcadas como cacheáveis ou não
3. Uniform Interface: recursos identificados por URL
4. Layered System: cliente não sabe se fala com servidor ou proxy
5. Code on Demand (opcional): scripts executáveis

Endpoints RESTful

# Recursos (substantivos, plurais)
GET    /api/v1/users          → lista usuários
POST   /api/v1/users          → cria usuário
GET    /api/v1/users/:id      → detalhe usuário
PUT    /api/v1/users/:id      → substitui usuário
PATCH  /api/v1/users/:id      → atualiza parcial
DELETE /api/v1/users/:id      → deleta usuário

# Relacionamentos
GET    /api/v1/users/:id/orders   → pedidos do usuário
GET    /api/v1/users/:id/orders/:orderId  → pedido específico

# Filtros, ordenação, paginação
GET /api/v1/users?status=active&sort=-created_at&page=2&limit=20
# Testar API com curl
curl -X GET https://api.github.com/users/octocat

curl -X POST https://api.exemplo.com/users \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer token123" \
  -d '{"name": "João", "email": "[email protected]"}'

curl -X DELETE https://api.exemplo.com/users/123

OpenAPI / Swagger

openapi: 3.0.0
info:
  title: Users API
  version: 1.0.0
paths:
  /users:
    get:
      summary: Lista usuários
      parameters:
        - name: page
          in: query
          schema:
            type: integer
      responses:
        200:
          description: Lista de usuários
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
    post:
      summary: Cria usuário
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUser'
      responses:
        201:
          description: Usuário criado
components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        email:
          type: string
          format: email

REST é um conjunto de constraints, não um padrão. Use substantivos plurais para recursos. Versionamento via URL (/v1/). OpenAPI é o padrão para documentação de APIs REST.