Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el caso de los puntos de conexión REST, los desarrolladores suelen querer controlar si las actualizaciones crean registros nuevos o solo modifican las existentes. El If-Match encabezado HTTP proporciona ese control en Data API Builder (DAB).
De forma predeterminada, DAB trata PUT y PATCH como operaciones upsert :
Si el recurso existe: se actualiza.
Si no existe, se inserta.
-
PUT→ upsert completo (reemplaza el recurso). -
PATCH→ upsert incremental (aplica una actualización parcial).
-
Agregar If-Match: * cambios en este comportamiento a la semántica de solo actualización.
Qué If-Match hace en DAB
If-Match solo se admite con el valor *comodín .
| Valor de encabezado | Comportamiento |
|---|---|
If-Match: * |
Realice la actualización solo si el recurso existe; si falta → no encontrado 404. |
If-Match: <any other> |
Rechazado; 400 Solicitud incorrecta (Etags not supported, use '*'). |
| (ausente) | Comportamiento de upsert (inserte si no se encuentra; de lo contrario, actualice). |
Información general sobre el comportamiento
- DAB no implementa la coincidencia de ETag por registro o versión.
- No se evalúa ningún token de simultaneidad.
*solo afirma "debe existir". - Solo se aplica a REST, no a GraphQL.
- Actualmente no es significativo para las operaciones DELETE.
Uso de If-Match con PUT
Sin If-Match, PUT inserta cuando el recurso no existe (devuelve 201 Created).
Ejemplo de solo actualización
Solicitud
PUT /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Return of the King"
}
Correcto (registro existente)
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Return of the King"
}
Error (falta el registro)
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Ejemplo de inserción upsert (no If-Match y el registro no existían)
Solicitud
PUT /api/Books/id/500
Content-Type: application/json
{
"title": "Inserted via PUT",
"publisher_id": 7
}
Respuesta
HTTP/1.1 201 Created
Location: id/500
Content-Type: application/json
{
"id": 500,
"title": "Inserted via PUT",
"publisher_id": 7
}
Uso de If-Match con PATCH
PATCH se comporta de forma similar. Sin If-Match, realiza un upsert incremental. Con If-Match: *, solo actualiza las filas existentes.
Solicitud
PATCH /api/Books/id/1
If-Match: *
Content-Type: application/json
{
"title": "The Two Towers"
}
Respuesta cuando se realiza correctamente
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Two Towers"
}
Respuesta cuando no se encuentra
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "No Update could be performed, record not found"
}
Uso de If-Match no válido
Se rechaza cualquier valor distinto * de (incluidas las cadenas entre comillas).
Solicitud
PUT /api/Books/id/1
If-Match: "abc123"
Content-Type: application/json
{
"title": "To Kill a Mockingbird"
}
Respuesta
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "Etags not supported, use '*'"
}
Revisión
- Omita
If-Matchla semántica upsert (insert-or-update). - Use
If-Match: *para la semántica estricta de solo actualización (404 si falta el elemento). - No use ningún otro valor. No se implementa la coincidencia de ETag real.