Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Para pontos de extremidade REST, os desenvolvedores geralmente querem ter controle sobre se as atualizações criam novos registros ou apenas modificam os existentes. O If-Match cabeçalho HTTP fornece esse controle no Data API builder (DAB).
Por padrão, o PUT DAB trata e PATCH como operações de upsert :
Se o recurso existir: o DAB atualiza-o.
Se não existir: o DAB insere-o.
-
PUT→ upsert completo (substitui o recurso). -
PATCH→ upsert incremental (aplica atualização parcial).
-
A adição If-Match: * altera esse comportamento à semântica somente atualização.
O que If-Match faz no DAB
If-Match é suportado apenas com o valor *curinga .
| Valor do Cabeçalho | Comportamento |
|---|---|
If-Match: * |
Execute a atualização somente se o recurso existir; se faltar → 404 Não encontrado. |
If-Match: <any other> |
Rejeitado; 400 Mau Pedido (Etags not supported, use '*'). |
| (ausente) | Comportamento Upsert (inserir se não for encontrado, caso contrário, atualizar). |
Visão geral do comportamento
- O DAB não implementa ETag por registro ou correspondência de versão.
- Nenhum token de simultaneidade é avaliado.
*apenas afirma "deve existir". - Aplica-se apenas ao REST, não ao GraphQL.
- Atualmente não é significativo para operações DELETE.
Usando If-Match com PUT
Sem If-Match, PUT insere quando o recurso não existe (retorna 201 Created).
Exemplo somente de atualização
Importante
Como PUT realiza uma substituição completa, o corpo do pedido deve incluir todas as colunas não anuláveis. Omitir uma coluna obrigatória causa um 400 Bad Request erro na base de dados, mesmo quando If-Match: * está presente. Use PATCH em vez de PUT se quiser enviar apenas um subconjunto de campos.
Pedido
PUT /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Return of the King",
"publisher_id": 7
}
Sucesso (recorde existente)
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Return of the King",
"publisher_id": 7
}
Falha (registro ausente)
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Upsert inserir exemplo (nenhum If-Match e registro não existia)
Pedido
PUT /api/Books/id/500
Content-Type: application/json
{
"title": "Inserted via PUT",
"publisher_id": 7
}
Resposta
HTTP/1.1 201 Created
Location: id/500
Content-Type: application/json
{
"id": 500,
"title": "Inserted via PUT",
"publisher_id": 7
}
Usando If-Match com PATCH
PATCH comporta-se de forma semelhante. Sem If-Match, ele executa um upsert incremental. Com If-Match: *o , ele atualiza apenas as linhas existentes.
Pedido
PATCH /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Two Towers"
}
Resposta quando o sucesso
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Two Towers"
}
Resposta quando não encontrado
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Uso de If-Match inválido
Qualquer valor diferente ( * incluindo cadeias de caracteres entre aspas) é rejeitado.
Pedido
PUT /api/Books/id/1
If-Match: "abc123"
Content-Type: application/json
{
"title": "To Kill a Mockingbird"
}
Resposta
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "Etags not supported, use '*'"
}
Revisão
- Omitir
If-Matchpara semântica upsert (inserir ou atualizar). - Use
If-Match: *para semântica somente atualização estrita (404 se o item estiver faltando). - Não use nenhum outro valor. A correspondência de ETag real não é implementada.
Observação
A funcionalidade Data API builder 2.0 descrita nesta secção está atualmente em pré-visualização e pode mudar antes da disponibilidade geral. Para mais informações, consulte O que há de novo na versão 2.0.