Peringatan dalam REST API sebagai bukan kesalahan kritis


9

Saya punya REST API yang untuk beberapa entpoinds seperti DELETE, POST atau PUT saya punya beberapa aturan validasi yang bisa mengembalikan kesalahan.

Sekarang saya membutuhkan jenis kesalahan baru seperti kesalahan yang tidak kritis, bahwa kesalahan tersebut seharusnya gagal dengan cara biasa, tetapi harus dilakukan jika ada bendera "peringatan penekanan" yang dikirim. Pengguna seperti itu dapat ditanya: "Apakah Anda yakin ingin mengubah status ini, Anda belum selesai"

Pertanyaan : apakah ada praktik terbaik untuk jenis kesalahan ini?

Pertanyaan sekunder :

  • Apakah ada semantik HTTP untuk perilaku yang dapat saya pengguna?
  • apakah saya masih mengikuti ide REST (bagi saya kelihatannya saya lakukan) - saya tetap stateless

Bagaimana Anda memutuskan apakah akan menampilkan peringatan seperti itu kepada pengguna? Anda memanggil titik akhir API untuk memeriksa status aplikasi dan kemudian menyajikan dialog seperti itu kepada pengguna, memblokir UI hingga pengguna merespons. Maka Anda membuat panggilan yang sebenarnya. Anda harus memodelkan ini dengan API REST Anda juga: menambahkan titik akhir untuk memeriksa apakah menyimpan untuk melakukan tugas tertentu. Dengan cara ini, setiap pengguna API dapat melakukan pemeriksaan "pra-penerbangan" dan bahkan mendelegasikan keputusan kepada pengguna. Pendekatan kode status HTTP Anda seperti rm /file"memperingatkan" file dibaca hanya saat menghapus saja.
coba-tangkap-akhirnya

Ini terjadi ketika bisnis tumpang tindih dengan kode status protokol. Bagaimanapun. Apakah Anda mencoba menggunakan kode status HTTP Anda sendiri? Jika Twitter bisa, Anda juga. Katakanlah misalnya 6xx? Ngomong-ngomong, sejauh ini saya tahu, Anda dapat menambahkan pesan ke dalam badan respons meskipun itu 4xx (rentang mana yang sesuai untuk kasus Anda).
Laiv

Akhirnya saya menggunakan 409 CONFLICTrespons peringatan. Dengan cara ini, klien diinstruksikan untuk memaksa panggilan dengan titik akhir dan badan yang sama dengan parameter exttra "force = 1"
user237329

Jawaban:


4

Tidak ada kode hasil peringatan di http, Anda bisa mengembalikan kesuksesan (200) atau kesalahan (400, 500). Satu-satunya hal yang saya ketahui yang dapat dianalogikan dengan apa yang Anda inginkan adalah sesuatu seperti kode 401 'tidak sah' - yang merupakan kegagalan total, tetapi menyebabkan sebagian besar klien secara otomatis mencoba kembali koneksi dengan kredensial.

Untuk REST API, Anda perlu memberi tahu server status permintaan dan cara menangani hasilnya - Anda tidak dapat mengirim PUT dan mengharapkan kesalahan jika klien belum selesai, atau berhasil jika sudah - server perlu mengetahui hal ini informasi untuk mengirim kembali kode hasil yang tepat.

Jadi Anda dapat mengirim bendera 'suppress warnings' dengan permintaan Anda, jika tidak disetel server akan mengembalikan kode kesalahan 409 (atau serupa), dan jika diatur, kembalikan kode 200 sebagai gantinya. Pengguna tidak dapat ditanya 'apakah Anda ingin mengubah status ini' setelah perubahan status dikirim.

Anda dapat membuat permintaan ke server untuk menanyakan apakah pengguna dapat mengubah status saja dan mengikuti dengan permintaan yang sesuai setelah itu.


Saya sama sekali tidak mengatakan itu adalah hal yang benar untuk dilakukan, tetapi kode 3xx dapat dilihat sebagai semacam pemberitahuan atau kode peringatan di mana klien dapat memutuskan untuk melanjutkan. Yang mengatakan, saya lebih baik melakukan tindakan atau tidak, dan mungkin saya mengembalikan respons dengan informasi tambahan di tubuh yang dikembalikan atau di header.
Archimedix

0

Jika Anda ingin mengizinkan pengguna untuk mengganti penanganan kesalahan normal Anda, Anda dapat mempertimbangkan mengembalikan status 200 SUKSES dengan informasi tambahan di header HTTP yang diperluas. Misalnya, Anda bisa kembali

X-APP-STATUS: 422 Unprocessable entity
X-APP-SOURCE: Invalid ID 'fo0'

Ini akan memberikan kode sisi klien Anda informasi yang diperlukan untuk memperingatkan pengguna atau mengambil tindakan korektif sendiri.


2
Saya tidak pernah menyukai tanggapan yang mengatakan "Saya berhasil gagal" :-)
gbjbaanb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.