AULA 35 MÓDULO 4 APIs REST ⏱ 50 min

REST em Profundidade

Convenções REST. Versionamento de API. Paginação por cursor vs offset. Resposta padronizada. Modelo de maturidade Richardson.

RESTversionamentopaginaçãocursorHATEOASconvenções

REST em profundidade

Boas APIs REST seguem convenções que tornam a interface previsível para qualquer desenvolvedor. Recursos, verbos semânticos, respostas padronizadas e paginação consistente.

📐
HATEOAS
A constraint mais ignorada: respostas incluem links para ações relacionadas. Nível de maturidade 3 do modelo Richardson. Poucos usam, mas é o REST 'completo'.

Versionamento de API

APIs mudam. Versionar permite evoluir sem quebrar clientes existentes.

URL path
/api/v1/users — mais explícito, mais usado
Header
Accept: application/vnd.api+json;version=2
Query string
/users?version=2 — menos recomendado

Paginação e filtros

Nunca retorne todos os registros de uma vez. Implemente paginação por offset ou cursor.

🔖
cursor vs offset
Offset: página 2 = OFFSET 20. Problema: se novos itens foram inseridos, você vê duplicatas. Cursor: depois de id=450. Estável mesmo com inserções. Use cursor para feeds e listas dinâmicas.
javascript
// API REST bem estruturada — resposta padronizada
const apiResponse = (data, meta = {}) => ({
  data,
  meta: { timestamp: new Date().toISOString(), ...meta }
})

// Paginação com cursor
app.get('/api/v1/products', async (req, res) => {
  const { limit = 20, after, category, sort = 'createdAt' } = req.query

  const products = await db.query(`
    SELECT * FROM products
    WHERE ($1::text IS NULL OR id > $1)
      AND ($2::text IS NULL OR category = $2)
    ORDER BY ${sort} DESC LIMIT $3
  `, [after, category, Number(limit) + 1])

  const hasNext = products.length > limit
  if (hasNext) products.pop()

  res.json(apiResponse(products, {
    cursor: hasNext ? products.at(-1)?.id : null,
    hasNext
  }))
})
quiz · aula 35
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
Qual é a vantagem de paginação por cursor sobre offset?
QUESTÃO 02
Por que versionar uma API com /api/v1/ na URL?
QUESTÃO 03
Qual é o modelo de maturidade Richardson?
0/3