HTTPQUERY
Bahasa Indonesia

428 Precondition Required

Penggunaan

Kode status 428 Precondition Required menandakan bahwa server mengharapkan permintaan HTTP jenis ini bersifat bersyarat dan menyertakan header HTTP yang sesuai seperti If-Match, If-None-Match, If-Modified-Since, dan If-Unmodified-Since.

Header HTTP tersebut secara opsional digunakan oleh klien ketika didukung oleh server, tetapi dalam kasus ini server mewajibkan penggunaannya. Bergantung pada kasus penggunaannya, hal ini dimaksudkan untuk mengurangi kejadian kehilangan data seperti masalah “lost update”.

Lost update terjadi ketika klien menggunakan GET untuk memperoleh sebuah sumber daya, memodifikasi sumber daya tersebut, dan menggunakan PUT untuk mengirim versi yang telah dimodifikasi kembali ke server. Tanpa campur tangan pihak ketiga, tidak ada masalah. Jika setelah GET awal ada pihak ketiga yang memodifikasi status sumber daya di server, timbullah konflik. Jika klien menggunakan PUT tanpa lebih dahulu memeriksa status sumber daya tersebut, pembaruan dari pihak ketiga akan tertimpa (sebuah lost update).

Dengan memberlakukan pengujian bersyarat menggunakan ETag dan tanggal, peluang klien menimpa pembaruan menjadi lebih kecil karena lebih sedikit asumsi yang dibuat tentang status sumber daya.

Hal ini berkaitan dengan respons 412 Precondition Failed, yang dikirim oleh server ketika satu atau lebih kondisi tidak terpenuhi.

Dampak SEO

Mesin pencari seperti Google tidak akan mengindeks URL dengan status respons 428. URL yang sebelumnya terindeks namun mengembalikan kode status ini akan dihapus dari hasil pencarian.

Contoh

Klien sebelumnya telah memperoleh salinan sumber daya tersebut dan sejak itu memodifikasi salinan lokalnya. Ketika klien mencoba melakukan PUT atas sumber daya tersebut dan memperbarui server, server merespons dengan 428 Precondition Required karena header HTTP tidak menyertakan pengujian bersyarat.

Permintaan

PUT /reservations.txt HTTP/1.1
Host: example.com

Respons

HTTP/1.1 428 Precondition Required
Content-Type: text/html
Content-Length: 193

<html>
  <head>
    <title>Conditional Update Required</title>
  </head>
  <body>
   <p>This PUT request must be done conditionally.
   Try again using If-Unmodified-Since.</p>
  </body>
</html>

Cara memperbaiki

Ambil terlebih dahulu sumber daya tersebut dengan permintaan GET dan ekstrak nilai ETag dari header respons. Kemudian kirim ulang permintaan yang memodifikasi (PUT, PATCH, atau DELETE) dengan header If-Match yang disetel ke nilai ETag yang diperoleh.

Sebagai alternatif, gunakan header If-Unmodified-Since dengan tanggal Last-Modified dari respons GET awal. Server membandingkan tanggal tersebut dan melanjutkan hanya jika sumber daya belum berubah sejak saat itu.

Pendekatan ETag lebih presisi. Stempel waktu memiliki granularitas tingkat detik dan melewatkan suntingan beruntun yang cepat. ETag berubah pada setiap modifikasi terlepas dari pengaturan waktunya.

Pastikan GET yang digunakan untuk mengambil ETag menargetkan sumber daya yang sama dengan permintaan modifikasi berikutnya. Menggunakan ETag dari rekaman yang berbeda memicu respons 412 Precondition Failed.

API yang dibangun di atas SAP, Salesforce, dan platform serupa umumnya mewajibkan permintaan bersyarat pada operasi pembaruan dan penghapusan. Periksa dokumentasi API untuk mengetahui endpoint mana yang memerlukan prakondisi dan header validator mana yang diterima.

Di sisi server, respons 428 membantu mencegah masalah “lost update”, yaitu ketika dua klien yang menyunting sumber daya yang sama saling menimpa. Menyertakan header ETag pada semua sumber daya yang dapat diubah memberikan klien nilai yang mereka butuhkan untuk permintaan bersyarat.

Referensi kode

.NET

HttpStatusCode.PreconditionRequired

Rust

http::StatusCode::PRECONDITION_REQUIRED

Rails

:precondition_required

Go

http.StatusPreconditionRequired

Symfony

Response::HTTP_PRECONDITION_REQUIRED

Python3.5+

http.HTTPStatus.PRECONDITION_REQUIRED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_PRECONDITION_REQUIRED

Angular

@angular/common/http/HttpStatusCode.PreconditionRequired