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 PUT değerlerini PATCH işlemleri olarak görür:

  • Kaynak varsa: DAB bunu güncelleştirir.

  • Yoksa: DAB ekler.

    • 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

Önemli

Tam değiştirme gerçekleştirdiğinden PUT , istek gövdesi null atanamayan tüm sütunları içermelidir. Gerekli bir sütunun atlanması, mevcut olsa 400 Bad Request bile veritabanı hatasına neden olurIf-Match: *. Yalnızca bir alan alt kümesi göndermek istiyorsanız yerine PATCH kullanınPUT.

İstek

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

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

Başarı (kayıt mevcut)

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

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

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.

Uyarı

Bu bölümde açıklanan Veri API'si oluşturucu işlevselliği 2.0 ve sonraki sürümlerde kullanılabilir. Daha fazla bilgi için bkz. Sürüm 2.0'daki yenilikler.