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: den uppdateras.

  • Om den inte finns infogas 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

Begäran

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

{
  "title": "The Return of the King"
}

Lyckades (posten fanns)

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

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

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)

Begäran

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.

Begäran

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.

Begäran

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

Review

  • 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.