Anda telah menjelaskan dua cara efektif untuk meminta berbagai bahasa. Baik harus bekerja dengan baik. Saya akan memilih parameter permintaan bahasa eksplisit untuk kode saya sendiri.
TL; DR Backstory
Ada tajuk Terima-Bahasa . Perhatikan, Accept
tidak Accepted
. Ini adalah bagian standar dari negosiasi konten HTTP. Respons biasanya mengatur header Konten-Bahasa kembali.
Accept-Language
adalah tawaran pembuka, menawarkan serangkaian opsi; Content-Language
adalah resolusi, yang menyatakan bahasa apa yang dipilih. Sebagian besar Content-Language
jawaban mengembalikan satu bahasa, tetapi ada opsi untuk memberikan daftar bahasa respons yang dipisahkan koma. Biasanya itu adalah konten campuran, tetapi tidak ada alasan itu tidak bisa menandakan beberapa alternatif yang terpisah. Jika Anda ingin klien meminta semua bahasa yang tersedia, sudah ada opsi permintaan wildcard *
,.
Jadi sudah ada mekanisme tajuk HTTP yang bisa Anda gunakan. Namun, berhati-hatilah bahwa Anda akan mendukung proses negosiasi yang lebih sering menghadirkan berbagai opsi yang mungkin, dan mendapatkan kembali satu opsi. Anda akan mengubah pengertian menjadi "ini daftar opsi, beri saya semua!" Jika Anda setuju dengan itu, Anda punya solusinya.
Namun, ada perdebatan besar tentang kesesuaian menandakan parameter REST API di header HTTP. Ini seperti memasuki restoran dan menyampaikan pesanan terperinci Anda kepada tuan rumah atau lebih daripada menunggu pelayan atau pelayan muncul. Ini dapat bekerja, dan mungkin bekerja dengan baik misalnya jika pesanan yang diarahkan pada tuan rumah berkaitan dengan minuman atau makanan pembuka - hal-hal yang tuan rumah dapat dengan cepat melihat, atau dengan cepat berkomunikasi ke server Anda. Tapi itu juga bisa dilihat sebagai pelanggaran protokol, ditujukan pada level / layer yang salah atau ke pemain yang salah.
Alternatif kedua adalah parameter permintaan eksplisit. Anda menyarankan ?all_languages=true
. Itu sepertinya terlalu spesifik. Sesuatu seperti lang=en,fr,es
(izinkan beberapa bahasa terdaftar) atau lang=*
atau lang=all
(tentukan setiap bahasa yang tersedia) tampaknya lebih umum. Ini dapat diungkapkan baik di URL atau badan permintaan.
Apa pun itu, respons multi-bahasa Anda dapat dengan mudah disandikan ke muatan JSON yang dikembalikan:
[ { "lang": "en", "content": "As Gregor Samsa awoke one morning..." },
{ "lang": "de", "content": "Als Gregor Samsa eines Morgens..." },
...
]
Pada akhirnya, salah satu dari pendekatan ini akan bekerja dengan baik untuk Anda. Keduanya dapat dipandang sebagai "desain RESTful API yang konsisten dan terstruktur dengan baik." Penentuan mana yang lebih baik sebagian besar terletak pada sikap Anda terhadap kesesuaian dukungan (dan sedikit mengubah rasa khas) header negosiasi konten HTTP.
Preferensi saya sendiri adalah untuk tidak mencampurkan header dan parameter lainnya sebagai bagian yang sama dari permintaan API. Parameter eksplisit lang
atau language
tampaknya lebih bersih bagi saya. Tapi karena HTTP kata kerja (misalnya GET
, PUT
, POST
, PATCH
, ...) adalah bagian dari header, dan juga penting untuk / bercampur dengan penafsiran permintaan, saya akui amplop vs isinya perbedaan adalah buatan bit dan kabur. Seperti kebanyakan keputusan desain, para ahli asli menjawabnya secara berbeda, dan YMMV.