Pada bagian ini kita akan membahas method HTTP secara mendetail. Pada bagian Protokol HTTP kita telah melihat sedikit mengenai method HTTP, dengan tujuh buah method utama yang dispesifikasikan oleh HTTP sebagai berikut:

Di bagian ini kita akan membahas secara mendalam cara kerja dan kegunaan dari masing-masing method. Ingat bahwa tidak semua method diimplementasikan oleh setiap server HTTP yang ada. Agar dapat memenuhi standar HTTP versi 1.1, sebuah server hanya cukup mengimplementasikan GET dan HEAD saja.
Bahkan untuk server yang mengimplementasikan seluruh method, biasanya akan terdapat batasan-batasan penggunaan. Misalnya, method DELETE dan PUT hanya bisa dijalankan oleh pengguna-pengguna tertentu yang telah terautentikasi dengan hak akses tertentu. Pada mayoritas kasus, kita tidak ingin pengguna dapat secara bebas menambahkan dan menghapus data pada server, karena hal tersebut merupakan lobang keamanan yang besar. Tentu saja batasan seperti ini berbeda-beda untuk setiap kasus, dan seringkali menjadi fitur konfigurasi untuk pengguna.
Safe and Idempotent Method
Sebuah method HTTP dikatakan safe (aman) jika method tersebut tidak mengubah data atau sumber daya yang ada pada server. Misalnya, GET dan HEAD merupakan method yang dianggap aman, yang berarti penggunaan GET maupun HEAD tidak akan mengubah representasi data atau memicu aksi tertentu pada server.
Maksud dari “tidak memicu aksi tertentu” di sini adalah server tidak melakukan apapun ketika request dikirimkan. Misalkan jika kita sedang mengunjungi situs belanja seperti Amazon atau Lazada, jika kita menekan tombol “Beli” maka biasanya browser akan mengirimkan request ke server untuk mengeksekusi pembelian, memasukkan data pembelian ke basis data, pembayaran kartu kredit, dan seterusnya. Pada kasus ini terjadi sebuah “aksi tertentu” yang mengubah representasi data (pengguna tidak membeli menjadi membeli). Bandingkan jika kita membuka sebuah halaman blog di mana server hanya akan mengambil dan mengembalikan data blog kepada kita.
Tentu saja perubahan akan data mungkin saja terjadi ketika kita melakukan pemanggilan request GET, misalnya server yang mencatat jumlah pembaca artikel blog. Yang paling penting ialah representasi data tidak berubah dan pengguna tidak meminta perubahan tersebut. Sebuah artikel blog tetap merupakan artikel blog setelah request, dengan isi yang tetap sama. Jumlah pembaca sedniri merupakan efek samping yang tidak diminta oleh pengguna, dan tidak merubah representasi, sehingga GET tetap dianggap aman. Hal ini berarti request seperti ini:
GET /blog/7777/delete HTTP/1.1
Contoh diatas adalah contoh yang tidak tepat, karena pemanggilan request akan menghapus artikel yang dituliskan pada blog.
Karena representasi data akan selalu sama pada setiap kali pemanggilan method yang aman, maka method jenis ini akan sangat mudah disimpan dalam cache, tanpa efek samping yang berarti pada data.
Sebuah method HTTP dikatakan idempotent jika method tersebut dapat dipanggil sebanyak berapa kalipun tanpa mengubah keluaran. Tidak penting apakah method dipanggil satu kali atau ratusan kali, hasil eksekusi akan selalu sama. Sekali lagi, maksud “hasil” di sini adalah hasil dalam arti representasi dan jenis data, bukan isi dari data itu sendiri. Isi data tentu saja dapat berubah, dan jika data berubah pemanggilan method akan memberikan “hasil” yang berbeda, meskipun representasi dan maknanya sama. Misalkan sebuah artikel berita dapat diperbaharui isinya oleh penulis, tetapi pengambilan data melalui URL dan method yang sama akan tetap terus mengembalikan artikel berita dengan identitas yang sama – apapun isi berita tersebut.
Perhatikan kedua contoh berikut:
a = 4; // 1
a++; // 2
Pada contoh kode di atas, kode yang ditandai 1 merupakan kode yang idempoten, karena nilai a akan selalu 4 berapa kalipun kode dijalankan. Kode yang bertanda 2 tidak idempoten karena nilai a akan berubah terus menerus pada tiap eksekusi baris tersebut. Kedua kode tersebut juga bukan merupakan kode yang aman, karena keduanya mengubah nilai a.
Sifat idempoten ini sangat penting untuk mengembangkan aplikasi server yang fault-tolerant (tahan banting). Misalnya ketika pengguna ingin memperbaharui sebuah data melalui POST. Karena POST bukan merupakan method yang idempoten, pengiriman request yang sama beberapa kali akan dapat menghasilkan pembaruan data yang salah. Akan terdapat banyak hal yang harus kita pertimbangkan ketika ingin memperbaharui data dengan method yang tidak idempoten, misalnya:
- Apa yang terjadi ketika request dikirimkan dan server mengalami timeout (terlalu lama memproses data sehingga dibatalkan)?
- Jika timeout terjadi, apakah data benar-benar telah diperbaharui? Bagaimana kita melakukan verifikasi terhadap hal ini?
- Bagaimana kita mengetahui apakah timeout terjadi ketika request dikirimkan atau ketika response dikirimkan?
- Jika timeout terjadi ketika request, apakah aman untuk mengirimkan request sekali lagi?
Dan masih banyak pertanyaan lainnya lagi. Dengan menggunakan method yang idempoten, kita tahu bahwa kita dapat mengirimkan request sekali algi dengan aman karena respon dan hasil eksekusi dijamin sama setiap kalinya.
Selanjutnya kita akan membahas status dari sifat idempoten dan keamanan yang masing-masing method memiliki standanya, untuk mempelajarinya klik tombol dibawah ini.



