A requisição precisa ser condicional.
Quando usar
Exigir If-Match em atualizações para evitar perda de gravações.
Causas comuns e soluções
O 428 avisa ao cliente que o servidor só aceita requisições condicionais aqui: envie If-Match com o ETag que você leu por último, para que edições simultâneas não se sobrescrevam silenciosamente, o problema da atualização perdida. Um cliente que recebe 428 deve fazer GET do recurso, pegar o cabeçalho ETag e reenviar o PUT ou PATCH com If-Match. Se nesse meio-tempo o ETag ficar desatualizado, a resposta é 412.
Como designer de API, exija-o só onde atualizações perdidas importam, e documente isso, porque a maioria dos clientes HTTP nunca envia cabeçalhos condicionais por conta própria. Retorne o ETag atual em todo GET e em toda escrita bem-sucedida. Proxies não geram 428; ele sempre vem da aplicação. Garanta que CDNs e compressão não reescrevam os ETags, senão o If-Match nunca vai corresponder.
Erro do cliente (4xx)
Os códigos 4xx são erros do cliente: a própria requisição está errada, não está autorizada ou aponta para algo que não existe. Repetir a mesma requisição não vai adiantar.
Como fica
HTTP/1.1 428 Precondition RequiredComo enviar
| Node.js / Express | res.status(428).end() |
|---|---|
| Python / Flask | return '', 428 |
| nginx | return 428; |
Como verificar
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/