Saya sedang bekerja melalui merancang API yang tenang. Kami tahu kami ingin mengembalikan JSON dan XML untuk sumber daya apa pun yang diberikan. Saya telah berpikir kami akan melakukan sesuatu seperti ini:
GET /api/something?param1=value1
Accept: application/xml (or application/json)
Namun, seseorang dikeluarkan menggunakan ekstensi untuk ini, seperti:
GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)
Apa untungnya dengan pendekatan ini? Apakah yang terbaik untuk mengandalkan tajuk terima saat ekstensi tidak ditentukan, tetapi menghormati ekstensi saat ditentukan? Apakah ada kelemahan dari pendekatan itu?
architecture
web-services
rest
http
Brandon Linton
sumber
sumber
Jawaban:
Ini, "Namun, secara filosofis - pendekatan pertama adalah satu-satunya pendekatan.", Dan ini "Pendekatan resmi resmi yang tepat adalah dengan menggunakan Accept: header." secara luas dianggap sebagai kasus, tetapi juga sama sekali tidak benar .
Berikut cuplikan singkat dari Roy Fielding (yang mendefinisikan REST) ...
"Bagian 6.2.1 tidak mengatakan bahwa negosiasi konten harus digunakan setiap saat." mengutip
Percakapan khusus itu dalam konteks tajuk 'Bahasa Terima:', tetapi hal yang sama berlaku untuk tajuk 'Terima:', sebagaimana dijelaskan kemudian dalam tanggapannya ...
"Saya tidak tahu mengapa orang tidak dapat melihat tautan kedua dan ketiga di halaman atas
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
yang mengarah ke dua edisi PDF. "
Maksudnya tidak ada masalah dalam menggunakan titik akhir yang berbeda untuk representasi berbeda dari data sumber yang sama. (Dalam hal ini satu .html endpoint dan dua endpoint .pdf berbeda.)
Juga dalam diskusi serupa, kali ini mengenai manfaat menggunakan parameter kueri vs menggunakan ekstensi file untuk berbagai jenis media ...
"Itu sebabnya aku selalu lebih suka ekstensi. Pilihan tidak ada hubungannya dengan REST." mengutip
Sekali lagi, itu sedikit berbeda dengan ekstensi Terima vs nama file, tetapi sikap Fielding masih jelas.
Jawab - benar-benar tidak masalah. Pertukaran antara keduanya tidak terlalu signifikan dan keduanya merupakan gaya yang dapat diterima.
sumber
Pendekatan resmi RESTful resmi yang tepat adalah dengan menggunakan
Accept:
header.Namun, Anda harus berhati-hati untuk tidak menghentikan cacheability, yang merupakan salah satu persyaratan REST. Anda harus memiliki
Vary: Accept
header dan cache yang memahaminya. Di dunia ideal Anda akan memilikinya, tetapi dalam kehidupan nyata, keberanian Anda mungkin berbeda. Jadi solusi kedua tidak bersih, tetapi mungkin lebih praktis.Juga, perhatikan bahwa beberapa browser yang sangat lama digunakan untuk mengabaikan header, sebagai gantinya bergantung pada ekstensi.
sumber
Secara teknis itu tidak terlalu penting - server web Anda akan dapat melewati proses dengan tepat seperti yang terlihat. (Saya mengasumsikan ini tetapi tidak terlihat seperti showstopper).
Namun, secara filosofis - pendekatan pertama adalah satu-satunya pendekatan. Di REST, URL sebenarnya hanya menunjuk ke URI - yang hanya sumber daya. Pikirkan sejenak sumber daya ini sama dengan objek dalam pemrograman berorientasi objek. Anda berbicara dengan sumber ini hanya melalui 4 metode (alias GET / POST / PUT / DELETE -atau jika ada yang memungkinkan), tetapi metode itu tidak menjadi deskripsi objek. Cara yang sama, aspek nilai kembali bukan URI. Objeknya masih sesuatu dan bukan sesuatu.xml atau sesuatu.json
Misalkan jika Anda tidak ingin menggunakan header Terima, tetapi jika Anda masih ingin benar-benar REST secara filosofis, saya tidak akan keberatan sesuatu seperti:
sebagai lawan
Tetapi seperti yang saya katakan, perbedaan ini hanya filosofis.
sumber
@artec: Saya pikir Anda salah
Prinsip resmi ISTIRAHAT yang tepat mengatakan tidak ada yang harus disembunyikan di header HTTP karena itu adalah URI yang diekspos atau direferensikan, setiap detail tentang permintaan / respons harus diberikan sebagai bagian dari URI
Oleh karena itu saya sangat menyarankan untuk menghindari menggunakan header untuk detail yang tentang permintaan & tanggapan, dan tetap berpegang pada
Saya tidak dapat menemukan referensi dengan cepat, tetapi saya akan mempostingnya kembali (sebenarnya Anda dapat merujuk buku publikasi O'reilly "Layanan web yang tenang" ( http://shop.oreilly.com/product/9780596529260.do ) yang menegaskan hal yang sama
sumber