Megosztás a következőn keresztül:


A If-Match HTTP-fejléc használata a PUT és a PATCH műveletekben

A REST-végpontok esetében a fejlesztők gyakran szeretnék szabályozni, hogy a frissítések új rekordokat hoznak-e létre, vagy csak a meglévőket módosítják. A If-Match HTTP-fejléc biztosítja ezt a vezérlőt a Data API Builderben (DAB).

Alapértelmezés szerint a DAB a következő műveleteket kezeli PUT és PATCH végzi el :

  • Ha az erőforrás létezik: frissítve van.

  • Ha nem létezik, akkor beszúrja.

    • PUT → teljes upsert (erőforrás helyett).
    • PATCH → növekményes upsert (részleges frissítést alkalmaz).

Ezt If-Match: * a viselkedést módosítja a csak frissítési szemantikához.

Mit If-Match a DAB-ban?

If-Match csak helyettesítő karakterrel *támogatott.

Fejléc értéke Magatartás
If-Match: * Csak akkor végezze el a frissítést, ha az erőforrás létezik; ha hiányzik → 404 Nem található.
If-Match: <any other> Elutasította; 400 Hibás kérelem (Etags not supported, use '*').
(hiányzik) Upsert viselkedés (beszúrás, ha nem található, egyébként frissítés).

Viselkedés áttekintése

  • A DAB nem implementálja a rekordonkénti ETag vagy verzióegyezést.
  • Nem történik egyidejűségi jogkivonat kiértékelése. * csak azt állítja, hogy "léteznie kell".
  • Csak a REST-ra vonatkozik, a GraphQL-ra nem.
  • A DELETE műveletek esetében jelenleg nem értelmezhető.

If-Match használata a PUT használatával

Nélküle If-Matcha PUT beszúrja, ha az erőforrás nem létezik (visszaadja 201 Created).

Csak frissítési példa

Kérelem

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

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

Siker (rekord már létezik)

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

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

Hiba (a rekord hiányzik)

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

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

Upsert insert example (nincs If-Match és a rekord nem létezik)

Kérelem

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

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

Válasz

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

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

If-Match használata a PATCH használatával

PATCH hasonlóan viselkedik. Anélkül If-Matchnövekményes upsertet hajt végre. Ezzel If-Match: *csak a meglévő sorokat frissíti.

Kérelem

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

{
  "title": "The Two Towers"
}

Válasz sikeresség esetén

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

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

Válasz, ha nem található

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

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

Érvénytelen If-Match használat

A rendszer nem (beleértve az idézett sztringeket) bármilyen értéket * elutasít.

Kérelem

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

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

Válasz

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

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

Felülvizsgálat

  • Kihagyja If-Match az upsert (insert-or-update) szemantikát.
  • Szigorú frissítési szemantikához használható If-Match: * (ha az elem hiányzik, 404).
  • Ne használjon más értéket. A valós ETag-egyeztetés nincs megvalósítva.