HTTPQUERY
Bahasa Indonesia

If-Match

Penggunaan

Header If-Match memungkinkan permintaan kondisional dengan membandingkan nilai ETag. Klien menyertakan header ini untuk memastikan server hanya memproses permintaan tersebut ketika entity tag sumber daya saat ini cocok dengan salah satu nilai yang dicantumkan.

Untuk metode aman seperti GET dan HEAD, header If-Match membatasi respons hanya pada sumber daya dengan entity tag yang cocok. Ini memilih representasi tertentu, bukan memvalidasi cache (validasi cache menggunakan If-None-Match sebagai gantinya).

Untuk metode yang mengubah status seperti PUT dan DELETE, header If-Match mencegah masalah lost update. Ketika dua klien mengambil sumber daya yang sama, memodifikasi salinannya masing-masing, lalu mencoba menuliskannya kembali, header If-Match memastikan hanya penulisan pertama yang berhasil. Penulisan kedua gagal dengan 412 Precondition Failed karena ETag berubah setelah penulisan pertama.

Pola ini dikenal sebagai optimistic concurrency control. Klien membaca sebuah sumber daya beserta ETag-nya, melakukan perubahan secara lokal, lalu mengirimkan pembaruan dengan If-Match disetel ke ETag asli. Server memastikan sumber daya tersebut belum berubah selama rentang waktu itu sebelum menerapkan pembaruan.

Header If-Match hanya melakukan perbandingan kuat (strong comparison). Entity tag lemah (berawalan W/) tidak akan cocok, bahkan ketika nilai opaque-nya identik. Perilaku ketat ini menjamin kesetaraan sumber daya hingga tingkat byte.

Daftar entity tag

Satu atau beberapa nilai ETag yang diapit tanda kutip ganda dan dipisahkan koma. Server memeriksa setiap nilai terhadap entity tag sumber daya saat ini.

Wildcard (*)

Tanda bintang * cocok dengan representasi sumber daya yang mana pun saat ini. Bentuk ini berhasil selama sumber daya target ada, terlepas dari nilai entity tag-nya. Nilai * umumnya digunakan bersama PUT untuk mencegah pembuatan sumber daya baru ketika sudah ada sumber daya di URI target.

Contoh

Klien mengirim permintaan PUT untuk memperbarui sebuah sumber daya. Header If-Match membawa ETag dari respons GET awal. Server menerapkan pembaruan hanya ketika ETag masih cocok.

PUT /document/42 HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Match: "a1b2c3d4"

{"title": "Updated Document"}

Ketika sumber daya telah dimodifikasi oleh klien lain, ETag tidak lagi cocok. Server merespons dengan 412 Precondition Failed dan menolak pembaruan tersebut.

HTTP/1.1 412 Precondition Failed
Content-Type: application/json
ETag: "e5f6g7h8"

Beberapa entity tag dicantumkan sebagai nilai yang dipisahkan koma. Kondisi tersebut berhasil ketika salah satu dari nilai yang dicantumkan cocok dengan ETag sumber daya saat ini.

If-Match: "a1b2c3d4", "x9y8z7w6"

Bentuk wildcard berhasil ketika sumber daya tersebut ada. Ini mencegah PUT membuat sumber daya baru secara tidak sengaja.

If-Match: *