HTTP 202 Diterima (HTTP / 1.1)
Anda mencari HTTP 202 Accepted
status. Lihat RFC 2616 :
Permintaan telah diterima untuk diproses, tetapi pemrosesan belum selesai.
Pemrosesan HTTP 102 (WebDAV)
RFC 2518 menyarankan menggunakan HTTP 102 Processing
:
Kode status 102 (Pemrosesan) adalah respons sementara yang digunakan untuk memberi tahu klien bahwa server telah menerima permintaan lengkap, tetapi belum menyelesaikannya.
tetapi memiliki peringatan:
Server HARUS mengirim respons akhir setelah permintaan selesai.
Saya tidak yakin bagaimana menafsirkan kalimat terakhir. Haruskah server menghindari pengiriman apa pun selama pemrosesan, dan hanya merespons setelah selesai? Atau itu hanya memaksa untuk mengakhiri respons hanya ketika pemrosesan berakhir? Ini bisa bermanfaat jika Anda ingin melaporkan kemajuan. Kirim HTTP 102 dan siram respons byte demi byte (atau baris demi baris).
Misalnya, untuk proses yang panjang tapi linier, Anda dapat mengirim seratus titik, membilas setiap karakter. Jika pihak klien (seperti aplikasi JavaScript) tahu bahwa ia harus mengharapkan tepat 100 karakter, itu dapat mencocokkannya dengan bilah kemajuan untuk ditampilkan kepada pengguna.
Contoh lain menyangkut proses yang terdiri dari beberapa langkah non-linear. Setelah setiap langkah, Anda dapat membuka pesan log yang pada akhirnya akan ditampilkan kepada pengguna, sehingga pengguna akhir dapat mengetahui bagaimana prosesnya.
Masalah dengan pembilasan progresif
Perhatikan bahwa meskipun teknik ini memiliki kelebihan, saya tidak akan merekomendasikannya . Salah satu alasannya adalah bahwa hal itu memaksa koneksi untuk tetap terbuka, yang bisa merugikan dalam hal ketersediaan layanan dan tidak skala dengan baik.
Pendekatan yang lebih baik adalah merespons dengan HTTP 202 Accepted
dan membiarkan pengguna untuk kembali kepada Anda nanti untuk menentukan apakah pemrosesan berakhir (misalnya dengan memanggil berulang kali URI yang diberikan seperti /process/result
yang akan merespons dengan HTTP 404 Tidak Ditemukan atau Konflik HTTP 409 hingga proses selesai dan hasilnya siap), atau beri tahu pengguna ketika pemrosesan selesai jika Anda dapat memanggil klien kembali misalnya melalui layanan antrian pesan ( misalnya ) atau WebSockets.
Contoh praktis
Bayangkan sebuah layanan web yang mengkonversi video. Titik masuknya adalah:
POST /video/convert
yang mengambil file video dari permintaan HTTP dan melakukan sihir dengannya. Mari kita bayangkan bahwa sihir itu intensif CPU, jadi itu tidak dapat dilakukan secara real-time selama transfer permintaan. Ini berarti bahwa setelah file ditransfer, server akan merespons dengan HTTP 202 Accepted
beberapa konten JSON, yang berarti “Ya, saya mendapatkan video Anda, dan saya sedang mengerjakannya; itu akan siap di suatu tempat di masa depan dan akan tersedia melalui ID 123. "
Klien memiliki kemungkinan untuk berlangganan antrian pesan untuk diberi tahu ketika pemrosesan selesai. Setelah selesai, klien dapat mengunduh video yang diproses dengan masuk ke:
GET /video/download/123
yang mengarah ke HTTP 200
.
Apa yang terjadi jika klien menanyakan URI ini sebelum menerima pemberitahuan? Nah, server akan merespons HTTP 404
karena, memang, videonya belum ada. Saat ini mungkin disiapkan. Itu mungkin tidak pernah diminta. Mungkin ada beberapa waktu di masa lalu dan dihapus kemudian. Yang penting adalah bahwa video yang dihasilkan tidak tersedia.
Sekarang, bagaimana jika klien tidak hanya peduli tentang video akhir, tetapi juga tentang kemajuan (yang akan menjadi lebih penting jika tidak ada layanan antrian pesan atau mekanisme serupa)?
Dalam hal ini, Anda dapat menggunakan titik akhir lain:
GET /video/status/123
yang akan menghasilkan respons yang mirip dengan ini:
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Melakukan permintaan berulang kali akan menunjukkan kemajuan sampai:
HTTP 200
{
"id": 123,
"status": "done",
"progress-percent": 100,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Sangat penting untuk membuat perbedaan antara ketiga jenis permintaan:
POST /video/convert
mengantri tugas. Ini harus dipanggil hanya sekali: memanggilnya lagi akan mengantri tugas tambahan.
GET /video/download/123
menyangkut hasil operasi: sumber daya adalah video. Pemrosesan — itulah yang terjadi di bawah tenda untuk menyiapkan hasil aktual sebelum permintaan dan secara independen terhadap permintaan — tidak relevan di sini. Itu dapat dipanggil sekali atau beberapa kali.
GET /video/status/123
menyangkut pemrosesan per se . Itu tidak mengantri apa pun. Itu tidak peduli dengan video yang dihasilkan. Sumber daya adalah proses itu sendiri. Itu dapat dipanggil sekali atau beberapa kali.