Haruskah saya mengizinkan parameter yang tidak diketahui?

12

Saya merancang API yang tenang dan dihadapkan dengan masalah judul, disajikan kembali untuk kejelasan:

Haruskah saya gagal dengan cepat jika klien mengirim parameter yang tidak dikenal? Sebagai contoh,

http://example.com/api/foo?bar=true&paula=bean

Di atas, baradalah parameter yang valid tetapi paulatidak ditentukan oleh API. Haruskah saya

  • Peringatkan klien kesalahan
  • Gagal cepat
  • Abaikan itu

Jika saya memperingatkan klien, saya hanya bisa mengeluarkan peringatan untuk parameter pertama, karena mereka bisa mengirimkan jumlah mereka yang hampir tak terbatas, dan server mungkin memiliki hal-hal yang lebih baik untuk dilakukan. Demikian pula, ketika gagal, itu hanya akan menentukan param tidak valid pertama sebagai masalah.

Saya lebih suka kegagalan daripada mengeluarkan peringatan untuk memaksa programmer untuk mengambil tindakan, karena mereka mungkin mengabaikan masalah dan terus membuang-buang sumber daya, atau berakhir dengan mengkultivasi kargo sendiri secara tidak sengaja. Tidak melakukan hal yang lebih buruk dalam hal itu.

Apakah argumen saya masuk akal? Apakah ada praktik yang diterima tentang hal-hal seperti itu?

sumpah
sumber
Berdasarkan pengujian kecil, semua situs yang saya uji mengabaikan parameter yang tidak diketahui yang saya berikan.
Bart van Ingen Schenau
@ BartvanIngenSchenau Sama di sini. Tidak masalah untuk halaman web tapi saya rasa tidak apa-apa untuk API yang sebenarnya
rath
2
Kekhawatiran adalah kompatibilitas ke depan. Jika argumen yang tidak dikenal diabaikan, adalah mungkin untuk menggunakannya dalam versi masa depan sedemikian rupa sehingga klien dapat memprogram ke API baru dan masih mendapatkan perilaku yang masuk akal pada server lama.
walpen
@walpen Itu poin yang menarik. Menggunakan URL berversi api/v1dll. Akan mengatasi hal itu, tetapi masih tidak memungkinkan untuk pembaruan tambahan. +1
rath
Di sana Anda dapat menemukan beberapa pro dan kontra dari perspektif langsung nyata: Parameter Ketat dan API Anda .
Remek Ambroziak

Jawaban:

12

Menurut pendapat saya, Anda harus mengembalikan status Permintaan Tidak Valid, sehingga klien tahu bahwa apa yang ia coba lakukan tidak valid. Pendapat saya tentang ini dipengaruhi oleh konsep bahwa RESTful APIs dapat ditemukan . Jika Anda memberikan informasi yang memadai di muka, maka klien tidak pernah mencoba membuat permintaan yang tidak valid untuk memulai. Jika ya, maka ada sesuatu yang salah dalam kode klien dan gagal dengan cepat akan mengingatkan bug kedua ini. Tentu saja, itu pendekatan yang sangat murni dan mungkin tidak disarankan jika API Anda tidak dapat ditemukan.

Pendekatan yang lebih pragmatis mungkin untuk mengabaikan param yang tidak valid, tetapi apa pun yang Anda lakukan, pastikan untuk mendokumentasikan perilaku dengan baik.

Bebek karet
sumber
1
Sebagai ekstensi: jika klien mengirim beberapa parameter yang tidak diketahui / hanya baca / usang, itu berarti, bahwa klien mengharapkan beberapa perilaku yang tidak akan terpenuhi. Dan oleh karena itu berbahaya untuk melakukan tindakan apa pun. Jadi saya setuju, benar-benar Permintaan Buruk
Stepan Stepanov
Terima kasih @StepanStepanov, tetapi ada filosofi "Bersikap permisif dalam apa yang Anda terima, eksplisit tentang apa yang Anda kirim" yang mendasari banyak arsitektur web. Dengan mengingat hal itu, saya dapat dengan mudah menulis jawaban yang bertentangan dengan jawaban yang sudah saya tulis.
RubberDuck
3
Saya sudah googled ini)) Dan halaman tentang hukum Postel mengatakan juga "kode yang menerima input harus menerima input yang tidak sesuai selama artinya jelas". Saya pikir, jika klien mengirim kami beberapa parameter yang tidak diketahui, artinya tidak bisa jelas. Jika klien mengirimi kami parameter yang tidak digunakan lagi, itu jelas, itu tidak akan berfungsi seperti sebelumnya dan seperti yang klien harapkan. Jika klien mengirimkan kepada kami parameter read-only yang jelas, itu tidak akan ditulis sesuai keinginan klien.
Stepan Stepanov
0

Jika Anda melakukan API publik (atau api yang akan digunakan oleh tim lain), saya akan merekomendasikan galat balik seperti yang disarankan @RubberDuck.

Jika api Anda akan dikonsumsi hanya di dalam tim Anda (atau hanya oleh Anda sendiri), mungkin lebih mudah untuk mengabaikan bidang tambahan (mis. Membutuhkan lebih sedikit kode dan lebih mudah dilakukan).

Konstantin Petrukhnov
sumber