Aracılığıyla paylaş


PUT ve PATCH işlemlerinde If-Match HTTP Üst Bilgisini kullanma

REST uç noktaları için geliştiriciler genellikle güncelleştirmelerin yeni kayıtlar oluşturup oluşturmadığını veya yalnızca mevcut kayıtları değiştirip değiştirmediğini denetlemek ister. If-Match HTTP üst bilgisi, Bu denetimi Veri API'sinin oluşturucusunda (DAB) sağlar.

VARSAYıLAN olarak DAB, ve PATCH değerlerini upsert işlemleri olarak görürPUT:

  • Kaynak varsa: güncelleştirilir.

  • Yoksa eklenir.

    • PUT → tam upsert (kaynağın yerini alır).
    • PATCH artımlı upsert → (kısmi güncelleştirme uygular).

Bu davranışı yalnızca güncelleştirme semantiğine eklendiğinde If-Match: * değişir.

DAB'de If-Match ne yapar?

If-Match yalnızca joker karakter değeriyle *desteklenir.

Üst Bilgi Değeri Davranış
If-Match: * Yalnızca kaynak varsa güncelleştirme gerçekleştirin; eksikse → 404 Bulunamadı.
If-Match: <any other> Reddedilmiş; 400 Hatalı İstek (Etags not supported, use '*').
(yok) Upsert davranışı (bulunamazsa ekleyin, aksi takdirde güncelleştirin).

Davranışa genel bakış

  • DAB kayıt başına ETag veya sürüm eşleştirme uygulamaz.
  • Eşzamanlılık belirteci değerlendirilmez. * yalnızca "var olması gerekir" onaylarını alır.
  • Yalnızca REST için geçerlidir, GraphQL için geçerli değildir.
  • DELETE işlemleri için şu anda anlamlı değildir.

PUT ile If-Match kullanma

olmadan If-Match, put kaynak mevcut olmadığında ekler (döndürür 201 Created).

Yalnızca güncelleştirme örneği

İstek

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

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

Başarı (kayıt mevcut)

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

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

Hata (kayıt eksik)

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

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

Upsert ekleme örneği (If-Match yok ve kayıt yoktu)

İstek

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

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

Yanıt

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

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

PATCH ile If-Match kullanma

PATCH benzer şekilde davranır. olmadan If-Matchartımlı bir upsert gerçekleştirir. ile If-Match: *yalnızca mevcut satırları güncelleştirir.

İstek

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

{
  "title": "The Two Towers"
}

Başarılı Olduğunda Yanıt

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

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

Bulunamadığında yanıt

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

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

Geçersiz If-Match Kullanımı

(tırnak içine alınmış dizeler dahil) dışındaki * tüm değerler reddedilir.

İstek

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

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

Yanıt

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

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

İnceleme

  • Upsert (insert-or-update) semantiği için atla If-Match .
  • Katı yalnızca güncelleştirme semantiği için kullanın If-Match: * (öğe eksikse 404).
  • Başka bir değer kullanmayın. Gerçek ETag eşleştirme uygulanmaz.