Dela via


Använd If-Match HTTP-huvud i PUT- och PATCH-åtgärder

För REST-slutpunkter vill utvecklare ofta ha kontroll över om uppdateringar skapar nya poster eller bara ändrar befintliga. If-Match HTTP-huvudet innehåller den kontrollen i Data API Builder (DAB).

Som standard behandlar PUT DAB och PATCH som driftstoppsåtgärder :

  • Om resursen finns: DAB uppdaterar den.

  • Om den inte finns: DAB infogar den.

    • PUT → fullständig upsert (ersätter resursen).
    • PATCH → inkrementell upsert (gäller partiell uppdatering).

Om du lägger till If-Match: * ändringar i det här beteendet till endast uppdateringssemantik.

Vad If-Match gör i DAB

If-Match stöds endast med jokertecknets värde *.

Rubrikvärde Beteende
If-Match: * Utför endast uppdatering om resursen finns. om det saknas → 404 hittades inte.
If-Match: <any other> Avvisad; 400 Felaktig begäran (Etags not supported, use '*').
(frånvarande) Upsert-beteende (infoga om det inte hittas, annars uppdatera).

Beteendeöversikt

  • DAB implementerar inte ETag eller versionsmatchning per post.
  • Ingen samtidighetstoken utvärderas. * hävdar bara att "måste finnas".
  • Gäller endast FÖR REST, inte GraphQL.
  • Inte meningsfullt för DELETE-åtgärder för närvarande.

Använda If-Match med PUT

Utan If-Matchinfogar PUT när resursen inte finns (returnerar 201 Created).

Endast uppdateringsexempel

Viktigt!

Eftersom PUT utför en fullständig ersättning måste begärandetexten innehålla alla kolumner som inte kan ogiltigförklaras. Om du utelämnar en obligatorisk kolumn uppstår ett 400 Bad Request databasfel, även när If-Match: * det finns. Använd PATCH i stället för PUT om du bara vill skicka en delmängd fält.

Förfrågan

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

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

Lyckades (posten fanns)

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

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

Fel (posten saknas)

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

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

Upsert Insert-exempel (ingen If-Match och posten fanns inte)

Förfrågan

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

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

Svar

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

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

Använda If-Match med PATCH

PATCH beter sig på liknande sätt. Utan If-Matchutför den en inkrementell upsert. Med If-Match: *uppdaterar den bara befintliga rader.

Förfrågan

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

{
  "title": "The Two Towers"
}

Svar när det lyckades

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

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

Svar när Hittades inte

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

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

Ogiltig användning av If-Match

Alla andra värden än * (inklusive angivna strängar) avvisas.

Förfrågan

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

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

Svar

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

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

Recension

  • If-Match Utelämna för upsert-semantik (insert-or-update).
  • Använd If-Match: * för strikt endast uppdateringssemantik (404 om objektet saknas).
  • Använd inget annat värde. Verklig ETag-matchning implementeras inte.

Anmärkning

Funktionerna i Data API Builder 2.0 som beskrivs i det här avsnittet är för närvarande i förhandsversion och kan komma att ändras före allmän tillgänglighet. Mer information finns i Nyheter i version 2.0.