Compartir a través de


Uso del encabezado HTTP de If-Match en operaciones PUT y PATCH

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: DAB lo actualiza.

  • Si no existe: DAB lo 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

Importante

Dado que PUT realiza un reemplazo completo, el cuerpo de la solicitud debe incluir todas las columnas que no aceptan valores NULL. Si se omite una columna necesaria, se produce un 400 Bad Request error de base de datos, incluso cuando If-Match: * está presente. Use PATCH en lugar de PUT si solo desea enviar un subconjunto de campos.

Solicitud

PUT /api/Books/id/1
If-Match: *
Content-Type: application/json

{
  "title": "The Return of the King",
  "publisher_id": 7
}

Correcto (registro existente)

HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 1,
  "title": "The Return of the King",
  "publisher_id": 7
}

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 '*'"
}

Reseña

  • Omita If-Match la 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.

Nota:

La funcionalidad de Data API Builder 2.0 descrita en esta sección se encuentra actualmente en versión preliminar y podría cambiar antes de la disponibilidad general. Para obtener más información, consulte Novedades de la versión 2.0.