Por que templates em vez de respostas fixas?
Uma Mock Rule com body estático retorna sempre o mesmo JSON. Isso funciona para casos simples, mas não consegue simular a lógica real de um backend: calcular totais, aplicar descontos diferentes por plano, retornar dados do próprio request ou validar regras de negócio.
O motor de templates do httpdrop é baseado em Handlebars.js e resolve esse problema sem exigir código. Você escreve expressões diretamente no campo Response Body da Mock Rule — o servidor as avalia em tempo de execução e retorna o resultado.
process.env, sem prototipagem de objetos do sistema (allowProtoPropertiesByDefault: false). Timeout automático de 100ms e output limitado a 64KB por resposta.Sintaxe em três linhas
{{helper arg1 arg2}}
{{helper (subHelper arg)}}
{{#if (operador A B)}}valor verdadeiro{{else}}valor falso{{/if}}
Aritmética
Calcule totais, impostos, descontos e conversões em tempo real. Os operadores aceitam números literais ou subexpressões como argumentos.
add{{add 10 5}}15subtract{{subtract 10 3}}7multiply{{multiply 4 2.5}}10divide{{divide 10 4}}2.5modulo{{modulo 10 3}}1floor / ceil / round{{floor 4.9}}4toFixed{{toFixed 9.999 2}}"10.00"{
"qty": "{{body 'qty'}}",
"price": "{{body 'price'}}",
"subtotal": "{{toFixed (multiply (body 'qty') (body 'price')) 2}}",
"tax": "{{toFixed (multiply (multiply (body 'qty') (body 'price')) 0.15) 2}}",
"total": "{{toFixed (multiply (multiply (body 'qty') (body 'price')) 1.15) 2}}"
}
Manipulação de Strings
Transforme, normalize e codifique strings com operadores encadeáveis. Útil para gerar slugs, emails derivados de nomes, e-mails normalizados e tokens de URL.
uppercase / lowercase{{uppercase 'hello'}}HELLOconcat{{concat 'foo' 'bar'}}foobarreplace{{replace 'hi world' 'world' 'you'}}hi youtrim{{trim ' hello '}}hellopadStart{{padStart '7' 3 '0'}}007slugify{{slugify 'João Silva'}}joao-silvaurlEncode{{urlEncode 'a b'}}a%20blen / substr{{substr 'hello' 0 3}}hel{
"original": "{{body 'name'}}",
"slug": "{{slugify (body 'name')}}",
"upper": "{{uppercase (body 'name')}}",
"email": "{{concat (lowercase (slugify (body 'name'))) '@example.com'}}",
"initials": "{{uppercase (substr (body 'name') 0 2)}}"
}
Datas e Expiração
O helper {{now}} aceita um formato e um offset relativo ao momento da requisição. Ideal para simular tokens JWT com iat/exp, logs de criação e datas de vencimento.
{{now 'iso'}}2026-05-23T14:30:00.000Z{{now 'sql'}}2026-05-23 14:30:00{{now 'unix'}}1748008200000{{now 'br'}}23/05/2026 14:30{{now '{days:30}' 'iso'}}30 dias no futuro{{now '{days:-7}' 'sql'}}7 dias atrás{{now '{months:3}' 'iso'}}3 meses no futuro{
"tokenId": "{{uuid}}",
"issuedAt": "{{now 'iso'}}",
"expiresAt": "{{now '{days:30}' 'iso'}}",
"expiresIn": 2592000,
"sqlCreated": "{{now 'sql'}}",
"unix": "{{now 'unix'}}"
}
Seleção Aleatória
{{oneOf}} retorna um valor diferente a cada requisição — perfeito para simular sistemas com estados variáveis como status de pedido, disponibilidade de estoque ou resultados de análise de risco.
{
"orderId": "{{param 'id'}}",
"status": "{{oneOf 'pending' 'processing' 'shipped' 'delivered' 'cancelled'}}",
"carrier": "{{oneOf 'Correios' 'Fedex' 'DHL' 'Jadlog'}}",
"estimatedDays": {{oneOf '1' '2' '3' '5' '7'}}
}
Condicionais por dados da requisição
Use {{#if (operador A B)}} para construir respostas que dependem de qualquer campo da requisição. Os operadores de comparação disponíveis são: eq, gt, lt, gte, lte, isNumber, isInteger, isDate.
{
"score": "{{body 'score'}}",
"approved": "{{#if (gte (body 'score') 600)}}true{{else}}false{{/if}}",
"tier": "{{#if (gte (body 'score') 800)}}platinum{{else}}{{#if (gte (body 'score') 700)}}gold{{else}}standard{{/if}}{{/if}}",
"creditLimit": "{{#if (gte (body 'score') 800)}}50000{{else}}{{#if (gte (body 'score') 700)}}20000{{else}}5000{{/if}}{{/if}}"
}
{
"plan": "{{query 'tier'}}",
"monthlyPrice": "{{#if (eq (query 'tier') 'pro')}}99{{else}}{{#if (eq (query 'tier') 'business')}}299{{else}}0{{/if}}{{/if}}",
"users": "{{#if (eq (query 'tier') 'business')}}unlimited{{else}}5{{/if}}"
}
Dados do Request
Qualquer dado da requisição de entrada pode ser usado como variável na resposta — body JSON, query params, headers, path params, método HTTP e o path completo.
body 'campo'{{body 'user.name'}}Campo do body JSON (aceita dot notation)query 'param'{{query 'page'}}Query string (?page=2)header 'nome'{{header 'x-tenant'}}Header HTTP (lowercase)param 'id'{{param 'id'}}Path param (/users/{id})method{{method}}Método HTTP da requisiçãoreqPath{{reqPath}}Path completo da requisição{
"method": "{{method}}",
"path": "{{reqPath}}",
"queryPage": "{{query 'page'}}",
"contentType": "{{header 'content-type'}}",
"bodyName": "{{body 'name'}}",
"requestId": "{{uuid}}"
}
JWT — Decodificando o Token da Requisição
Use {{jwtPayload}} e {{jwtHeader}} para extrair campos do token Bearer enviado na requisição. Ideal para simular endpoints autenticados que retornam dados do próprio usuário.
{
"userId": "{{jwtPayload (header 'authorization') 'sub'}}",
"email": "{{jwtPayload (header 'authorization') 'email'}}",
"role": "{{jwtPayload (header 'authorization') 'role'}}",
"algorithm": "{{jwtHeader (header 'authorization') 'alg'}}"
}
Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyXzEyMyIsImVtYWlsIjoidGVzdGVAZXhhbXBsZS5jb20iLCJyb2xlIjoiYWRtaW4ifQ.sig como header Authorization — o motor decodifica o payload e retorna {"userId":"user_123","email":"teste@example.com","role":"admin","algorithm":"HS256"}. A assinatura não é validada.Store — Contadores Persistentes
O K-V Store persiste valores por chave, por endpoint, enquanto o servidor estiver rodando. Ideal para simular rate limiting, sequências de estado e contadores de chamadas.
{
"callCount": {{storeIncr 'hits'}},
"allowed": "{{#if (lte (storeGet 'hits') 3)}}true{{else}}false{{/if}}",
"message": "{{#if (lte (storeGet 'hits') 3)}}OK ({{storeGet 'hits'}}/3){{else}}Rate limit exceeded{{/if}}"
}
Faça 5 chamadas seguidas para o endpoint — as 3 primeiras retornam allowed: "true"; as seguintes retornam false. Use {{storeReset 'hits'}} em outra rule para zerar o contador.
Faker Avançado
A nova sintaxe {{faker 'categoria.gerador' 'opções'}} desbloqueia generators com parâmetros — ranges numéricos, formatos de data, precisão de float. Totalmente compatível com a sintaxe legada {{faker.campo}}.
{{faker 'name'}}{{faker.name}}Ana Ribeiro{{faker 'cpf'}}{{faker.cpf}}123.456.789-09{{faker 'number.int' '{min:300,max:850}'}}—647 (inteiro no range){{faker 'number.float' '{precision:0.01}'}}—3.14{{faker 'date.past' 'iso'}}—2023-07-12T...{{faker 'date.future' 'iso'}}—2027-02-18T...{
"id": "{{faker 'uuid'}}",
"name": "{{faker 'name'}}",
"email": "{{faker 'email'}}",
"cpf": "{{faker 'cpf'}}",
"phone": "{{faker 'phone'}}",
"score": {{faker 'number.int' '{min:300,max:850}'}},
"birthDate": "{{faker 'date.past' 'iso'}}",
"nextReview": "{{faker 'date.future' 'iso'}}",
"address": "{{faker 'address'}}",
"zip": "{{faker 'cep'}}"
}
Compatibilidade com a sintaxe antiga
Toda sintaxe legada é convertida automaticamente para a nova antes da renderização — suas Mock Rules existentes continuam funcionando sem alteração.
{{faker.cpf}}{{faker 'cpf'}}{{req.body.campo}}{{body 'campo'}}{{req.query.x}}{{query 'x'}}{{req.headers.x}}{{header 'x'}}{{req.params.id}}{{param 'id'}}{{env.KEY}}{{env 'KEY'}}{{base64.x,y}}{{base64Combine x y}}{{uuid}} / {{timestamp}}mantidos (sem conversão)Use cases reais
{{oneOf}} para simular status de pedido variável e {{faker 'date.future'}} para datas de entrega realistas.{{jwtPayload}} e retorne os dados do próprio usuário no endpoint /me — sem precisar de banco de dados real.{{storeIncr}} para acumular contadores entre chamadas e simular paginação real, contagem de visualizações e rate limiting por endpoint.{{env 'KEY'}} acessa somente variáveis do Workspace — nunca process.env. {{storeIncr}} reseta ao reiniciar o servidor.