Metode API RESTful; KEPALA & OPSI

97

Saya sedang menulis modul RESTful API untuk aplikasi di PHP, dan saya agak bingung dengan kata kerja HEADdan OPTIONS.

  • OPTIONS  Digunakan untuk mengambil kata kerja HTTP yang tersedia untuk sumber daya tertentu?
  • HEAD Digunakan untuk menentukan apakah suatu sumber daya tersedia?

Jika seseorang dapat mengklarifikasi * kata kerja ini, itu akan sangat dihargai.

* Klarifikasi sehubungan dengan arsitektur RESTful API yang menggunakan kembali kata kerja HTTP. Saya sudah sejak datang ke realisasi bahwa kedua HEADdan OPTIONSharus tidak menjadi re-bertujuan, dan sebagai gantinya berperilaku diduga sebagai aplikasi HTTP seharusnya. Oh, betapa kita tumbuh dalam 2 tahun.

Dan Lugg
sumber
kemungkinan karena spesifikasi HTTP sudah tersedia di web.
Gordon
@Gordon - Cukup adil, dan sementara saya memahami layanan API RESTful dimaksudkan untuk memanfaatkan spesifikasi HTTP yang ada, saya rasa saya menganggap beberapa penyimpangan parsial untuk detail implementasi. Salahku.
Dan Lugg
15
Spesifikasi untuk hampir semua hal sudah tersedia di web. Pertanyaan tentang SO adalah untuk klarifikasi di luar dokumentasi. Ini cocok dengan itu.
Andrew Ensley

Jawaban:

62

Sesuai: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.2 OPSI

Metode OPTIONS mewakili permintaan informasi tentang opsi komunikasi yang tersedia di rantai permintaan / respons yang diidentifikasi oleh URI Permintaan. Metode ini memungkinkan klien untuk menentukan opsi dan / atau persyaratan yang terkait dengan sumber daya, atau kemampuan server, tanpa menyiratkan tindakan sumber daya atau memulai pengambilan sumber daya.

Tanggapan untuk metode ini tidak dapat disimpan dalam cache.

Jika permintaan OPTIONS menyertakan badan-entitas (seperti yang ditunjukkan dengan adanya Panjang Konten atau Pengkodean-Transfer), maka jenis media HARUS ditunjukkan dengan bidang Jenis Konten. Meskipun spesifikasi ini tidak menentukan penggunaan apa pun untuk badan semacam itu, ekstensi HTTP di masa mendatang mungkin menggunakan badan OPTIONS untuk membuat kueri yang lebih mendetail di server. Server yang tidak mendukung ekstensi seperti itu DAPAT membuang isi permintaan.

Jika Request-URI adalah asterisk ("*"), permintaan OPTIONS dimaksudkan untuk diterapkan ke server secara umum daripada ke sumber daya tertentu. Karena opsi komunikasi server biasanya bergantung pada sumber daya, permintaan "*" hanya berguna sebagai metode jenis "ping" atau "no-op"; ia tidak melakukan apa pun selain mengizinkan klien untuk menguji kemampuan server. Misalnya, ini dapat digunakan untuk menguji proxy untuk kepatuhan HTTP / 1.1 (atau ketiadaan).

Jika URI Permintaan bukan tanda bintang, permintaan OPSI hanya berlaku untuk opsi yang tersedia saat berkomunikasi dengan sumber daya itu.

Respons 200 HARUS menyertakan kolom header apa pun yang menunjukkan fitur opsional yang diterapkan oleh server dan berlaku untuk sumber daya itu (misalnya, Izinkan), mungkin termasuk ekstensi yang tidak ditentukan oleh spesifikasi ini. Badan respons, jika ada, HARUS juga menyertakan informasi tentang opsi komunikasi. Format untuk badan semacam itu tidak ditentukan oleh spesifikasi ini, tetapi mungkin ditentukan oleh ekstensi mendatang untuk HTTP. Negosiasi konten DAPAT digunakan untuk memilih format tanggapan yang sesuai. Jika tidak ada isi tanggapan yang disertakan, tanggapan HARUS menyertakan bidang Panjang Konten dengan nilai bidang "0".

Bidang header permintaan Penerusan Maks. DAPAT digunakan untuk menargetkan proxy tertentu dalam rantai permintaan. Ketika proxy menerima permintaan OPTIONS pada absoluteURI yang penerusan permintaannya diizinkan, proxy HARUS memeriksa bidang Max-Forwards. Jika nilai kolom Max-Forward adalah nol ("0"), proxy TIDAK HARUS meneruskan pesan; sebagai gantinya, proxy HARUS merespons dengan opsi komunikasinya sendiri. Jika nilai bidang Max-Forward adalah bilangan bulat yang lebih besar dari nol, proxy HARUS menurunkan nilai bidang saat meneruskan permintaan. Jika tidak ada bidang Max-Forward yang ada dalam permintaan, maka permintaan yang diteruskan HARUS TIDAK menyertakan bidang Max-Forward.

9.4 KEPALA

Metode HEAD identik dengan GET, kecuali bahwa server TIDAK HARUS mengembalikan badan pesan dalam respons. Metainformation yang terdapat dalam header HTTP sebagai tanggapan atas permintaan HEAD HARUS identik dengan informasi yang dikirim sebagai tanggapan atas permintaan GET. Metode ini dapat digunakan untuk memperoleh metainformasi tentang entitas yang tersirat oleh permintaan tanpa mentransfer badan-entitas itu sendiri. Metode ini sering digunakan untuk menguji tautan hypertext untuk validitas, aksesibilitas, dan modifikasi terbaru.

Respons untuk permintaan HEAD MUNGKIN dapat disimpan dalam cache dalam arti bahwa informasi yang terdapat dalam respons MUNGKIN digunakan untuk memperbarui entitas yang sebelumnya di-cache dari sumber daya itu. Jika nilai bidang baru menunjukkan bahwa entitas yang di-cache berbeda dari entitas saat ini (seperti yang akan ditunjukkan oleh perubahan dalam Panjang Konten, Content-MD5, ETag atau Last-Modified), cache HARUS memperlakukan entri cache sebagai basi.

sdolgy
sumber
1
Terima kasih @sdolgy untuk kutipan lengkapnya; namun, dalam praktiknya, apakah ( harus ) banyak modul RESTful API yang berhasil mematuhi semua standar HTTP ini, atau apakah ada respons tipis yang dapat diterima untuk operasi ini? Bukan karena kemalasan, tapi hanya karena rasa ingin tahu; Saya kemungkinan akan menerapkan semua yang diperlukan untuk dipatuhi.
Dan Lugg
2
jika Anda membangunnya sendiri, yang menurut saya memang demikian, Anda harus mencoba mempertahankan beberapa keselarasan dengan standar yang terdokumentasi untuk membuat hidup Anda lebih mudah ... dan orang-orang yang mengonsumsi api Anda ... jangan mengikuti Microsoft. RFC adalah hal yang baik untuk diselaraskan
sdolgy
Terima kasih @sdolgy. Setelah menjelaskan dokumen terkait, saya perhatikan di bagian akhir CONNECTkata kerja. Apakah itu pilihan yang buruk untuk menggunakan metode itu untuk otentikasi RESTful?
Dan Lugg
Tidak yakin itu adalah tujuan yang dimaksudkan "Spesifikasi ini mencadangkan nama metode CONNECT untuk digunakan dengan proxy yang dapat secara dinamis beralih menjadi terowongan (misalnya, tunneling SSL [44])." ... mungkin berguna untuk memposting pertanyaan lain di salah satu dari situs
stackexchange.com
2
@DanLugg Aplikasi Anda mungkin tidak menggunakan CONNECTcara tunneling SSL, tetapi bayangkan apa yang akan terjadi jika konsumen aplikasi Anda memiliki proxy yang diimplementasikan CONNECTdengan cara yang ditentukan di RFC, permintaan mungkin tidak diteruskan ke Anda. aplikasi.
Steve Buzonas
92

OPTIONSmetode mengembalikan info tentang API (metode / tipe konten)

HEADmetode mengembalikan info tentang sumber daya (versi / panjang / jenis)

Respons server

PILIHAN

HTTP/1.1 200 OK
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:24:43 GMT
Content-Length: 0

KEPALA

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:12:29 GMT
ETag: "780602-4f6-4db31b2978ec0"
Last-Modified: Thu, 25 Apr 2013 16:13:23 GMT
Content-Length: 1270
  • OPTIONS Mengidentifikasi metode HTTP mana yang didukung suatu sumber daya, misalnya dapatkah kita MENGHAPUS atau memperbaruinya melalui PUT?
  • HEADMemeriksa apakah sumber daya telah berubah. Ini berguna saat mempertahankan versi cache dari sumber daya
  • HEAD Mengambil metadata tentang sumber daya, misalnya jenis medianya atau ukurannya, sebelum melakukan pengambilan yang mungkin mahal
  • HEAD, OPTIONSMenguji apakah sumber daya ada dan dapat diakses. Misalnya, memvalidasi tautan yang dikirimkan pengguna dalam aplikasi

Berikut adalah artikel yang bagus dan ringkas tentang bagaimana HEAD dan OPTIONS cocok dengan arsitektur RESTful.

Yuriy Kvartsyanyy
sumber
9
Jawaban yang bagus, sayang sekali itu akan membayar denda yang terlambat ke pesta. Jawaban diterima copy-paste bahkan tidak mulai membahas tempat kata kerja ini dalam arsitektur RESTful secara khusus.
Todd Menier
1
Tautan Anda sudah mati. Berikut snapshot terakhirnya: web.archive.org/web/20160528151316/https://...
Kolobok
31

OPTIONS memberi tahu Anda hal-hal seperti "Metode apa yang diizinkan untuk sumber daya ini".

HEAD mendapatkan header HTTP yang akan Anda dapatkan jika Anda membuat permintaan GET, tetapi tanpa isi. Ini memungkinkan klien menentukan informasi cache, tipe konten apa yang akan dikembalikan, kode status apa yang akan dikembalikan. Ketersediaannya hanya sebagian kecil saja.

Quentin
sumber
Terima kasih @Quentin; OPTIONSItulah yang saya pikirkan, dan implementasi seperti itu akan mudah dengan pendekatan saya yang ada. Sesuai kutipan RFC sdolgy, OPTIONStidak mendefinisikan standar dalam format. Apakah diasumsikan format respon sama dengan respon lainnya? ( mis.; JSON, XML, dll. )
Dan Lugg
@Tomcat Mengutip RFC: "Negosiasi konten DAPAT digunakan untuk memilih format tanggapan yang sesuai." Dengan kata lain: respons harus sesuai dengan yang diminta oleh Request di header.
Gordon