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 If-Match: * bile veritabanı hatasına neden olur400 Bad Request. Yalnızca bir alan alt kümesi göndermek istiyorsanız yerine PUT kullanınPATCH.

İ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 oluşturucusu 2.0 işlevselliği şu anda önizleme aşamasındadır ve genel kullanılabilirlik öncesinde değişebilir. Daha fazla bilgi için bkz. Sürüm 2.0'daki yenilikler.