Partager via


Utiliser l’en-tête HTTP If-Match dans les opérations PUT et PATCH

Pour les points de terminaison REST, les développeurs veulent souvent contrôler si les mises à jour créent de nouveaux enregistrements ou modifient uniquement les enregistrements existants. L’en-tête If-Match HTTP fournit ce contrôle dans le Générateur d’API de données (DAB).

Par défaut, DAB traite PUT et PATCH comme des opérations upsert :

  • Si la ressource existe : DAB la met à jour.

  • S’il n’existe pas : DAB l’insère.

    • PUT → full upsert (remplace la ressource).
    • PATCH → upsert incrémentiel (applique une mise à jour partielle).

Ajout de If-Match: * modifications de ce comportement à la sémantique de mise à jour uniquement.

Que fait If-Match dans DAB

If-Match est pris en charge uniquement avec la valeur *générique .

Valeur de l’en-tête Comportement
If-Match: * Effectuez la mise à jour uniquement si la ressource existe ; s’il manque → 404 Introuvable.
If-Match: <any other> Rejeté; 400 Demande incorrecte (Etags not supported, use '*').
(absent) Comportement Upsert (insérer s’il n’est pas trouvé, sinon mettre à jour).

Vue d’ensemble du comportement

  • DAB n’implémente pas la correspondance par enregistrement ETag ou version.
  • Aucun jeton d’accès concurrentiel n’est évalué. * affirme uniquement « doit exister ».
  • S’applique uniquement à REST, et non à GraphQL.
  • Actuellement non significatif pour les opérations DELETE.

Utilisation de If-Match avec PUT

Sans If-Match, PUT insère lorsque la ressource n’existe pas (retourne 201 Created).

Exemple de mise à jour uniquement

Important

Étant donné qu’il PUT effectue un remplacement complet, le corps de la requête doit inclure toutes les colonnes non nullables. L’omission d’une colonne requise provoque une 400 Bad Request erreur de base de données, même lorsqu’elle If-Match: * est présente. Utilisez PATCH plutôt PUT que si vous souhaitez uniquement envoyer un sous-ensemble de champs.

Requête

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

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

Réussite (enregistrement existait)

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

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

Échec (enregistrement manquant)

HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "error": "No Update could be performed, record not found"
}

Exemple d’insertion Upsert (aucun If-Match et enregistrement n’existait pas)

Requête

PUT /api/Books/id/500
Content-Type: application/json

{
  "title": "Inserted via PUT",
  "publisher_id": 7
}

Réponse

HTTP/1.1 201 Created
Location: id/500
Content-Type: application/json

{
  "id": 500,
  "title": "Inserted via PUT",
  "publisher_id": 7
}

Utilisation de If-Match avec PATCH

PATCH se comporte de la même façon. Sans If-Match, il effectue un upsert incrémentiel. Avec If-Match: *, il met uniquement à jour les lignes existantes.

Requête

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

{
  "title": "The Two Towers"
}

Réponse en cas de réussite

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

{
  "id": 1,
  "title": "The Two Towers"
}

Réponse lorsqu’elle est introuvable

HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "error": "No Update could be performed, record not found"
}

Utilisation de If-Match non valide

Toute valeur autre que * (y compris les chaînes entre guillemets) est rejetée.

Requête

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

{
  "title": "To Kill a Mockingbird"
}

Réponse

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error": "Etags not supported, use '*'"
}

Révision

  • Omettez If-Match la sémantique upsert (insert-or-update).
  • Utiliser If-Match: * pour une sémantique de mise à jour uniquement stricte (404 si l’élément est manquant).
  • N’utilisez aucune autre valeur. La correspondance ETag réelle n’est pas implémentée.

Note

La fonctionnalité 2.0 du Générateur d’API de données décrite dans cette section est actuellement en préversion et peut changer avant la disponibilité générale. Pour plus d’informations, consultez Nouveautés de la version 2.0.