Baris permintaan GET /produk HTTP/1.1 pada chapter sebelumnya diawali sebuah token bernama method. Method adalah kata kerja dari sebuah request: token inilah yang menyatakan maksud klien — sekadar membaca data, mengirim data baru, mengubah, atau menghapus. Pilihan method yang tepat membuat API Anda mudah dipahami orang lain, membuat cache dan browser berperilaku benar, dan mencegah bug klasik seperti data yang terkirim dua kali. Pada chapter ini kita akan membedah method-method utama, konsep safe dan idempotent, lalu melihat bagaimana PHP mengekspos method beserta datanya.

Apa Itu HTTP Method #

Jika resource adalah kata benda (produk, artikel, pengguna), maka method adalah kata kerja yang menghubungkan klien dengan resource tersebut. GET /produk/7 dibaca sebagai “ambil produk nomor 7”, sedangkan DELETE /produk/7 berarti “hapus produk nomor 7”. Path yang sama bisa bermakna berbeda total tergantung method yang menyertainya.

Semantik setiap method didefinisikan oleh spesifikasi HTTP, tetapi penegakannya ada di tangan Anda sebagai penulis kode server. PHP tidak akan menolak ketika skrip Anda mengubah data lewat request GET — protokol hanya mendefinisikan makna, bukan memaksa. Karena itu memahami kontrak tiap method adalah bekal minimum sebelum merancang endpoint yang layak dipakai orang lain.

Method yang Paling Sering Digunakan #

Tujuh method berikut menutup hampir seluruh kebutuhan aplikasi web sehari-hari:

MethodMaksud umumContoh pemakaian
GETmembaca data tanpa mengubah apa punmembuka halaman daftar produk
POSTmengirim data baru atau memicu pemrosesansubmit form pendaftaran
PUTmengganti seluruh isi sebuah resourceupdate profil lengkap via API
PATCHmengubah sebagian isi resourceubah hanya kolom harga produk
DELETEmenghapus resourcehapus item dari keranjang
HEADseperti GET tetapi tanpa bodymemeriksa keberadaan dan ukuran berkas
OPTIONSmenanyakan method apa yang didukungpemeriksaan awal (preflight) CORS di browser

Form HTML pada praktiknya hanya mampu mengirim GET dan POST, sehingga kedua method itu akan paling sering Anda lihat di awal perjalanan. PUT, PATCH, dan DELETE menjadi kebutuhan utama begitu Anda membangun API yang dikonsumsi aplikasi lain. HEAD berguna untuk cek murah — server memproses seperti GET lalu membuang body-nya, sehingga klien tahu status dan ukuran tanpa mengunduh isi. OPTIONS biasanya tidak Anda tulis manual; browser yang mengirimnya secara otomatis sebelum request lintas domain.

Aman dan Idempoten #

Dua properti method menentukan bagaimana klien boleh memperlakukan request Anda. Sebuah method disebut safe (aman) bila request-nya tidak mengubah keadaan server — seperti membaca buku di perpustakaan. Sebuah method disebut idempotent (idempoten) bila menjalankan request yang sama berkali-kali menghasilkan efek yang sama dengan menjalankannya sekali — menekan tombol lift sepuluh kali tetap memanggil satu lift.

MethodSafeIdempoten
GETyaya
HEADyaya
OPTIONSyaya
PUTtidakya
DELETEtidakya
POSTtidaktidak
PATCHtidaktidak (umumnya)

Pada tabel di atas, PUT berada di kolom safe “tidak” karena mengganti isi resource merupakan perubahan, meskipun sifat penggantiannya menyeluruh membuatnya idempoten. DELETE idempoten karena menghapus resource yang sama berulang kali berakhir pada satu keadaan akhir yang sama (resource sudah tidak ada). POST tidak idempoten — form pesanan yang dikirim dua kali menghasilkan dua pesanan.

Konsekuensi praktisnya nyata. Browser boleh melakukan prefetch request GET karena method ini dijamin aman, tetapi tidak pernah mem-prefetch POST. Klien HTTP umumnya hanya mencoba ulang request idempoten ketika koneksi terputus di tengah jalan, karena request seperti itu tidak membahayakan data.

Method di Sisi PHP #

PHP mengekspos method melalui $_SERVER["REQUEST_METHOD"], lalu memilah datanya ke beberapa tempat: query string masuk ke $_GET, data form POST masuk ke $_POST, dan body mentah dapat dibaca dari stream php://input. Berikut simulasi bagaimana PHP mengisi $_GET dari query string:

php
<?php
// Simulasi query string: /produk?kategori=buku&halaman=2
$_GET["kategori"] = "buku";
$_GET["halaman"] = "2";

echo "Kategori: " . $_GET["kategori"] . "\n";
echo "halaman + 1 = " . ($_GET["halaman"] + 1) . "\n";
var_dump($_GET["halaman"]);

Output yang Dihasilkan:

text
Kategori: buku
halaman + 1 = 3
string(1) "2"

Dua hal penting dari output di atas. Pertama, PHP mengisi $_GET dengan memilah query string menjadi pasangan kunci-nilai — kita tidak perlu mengurai string mentahnya sendiri. Kedua, var_dump membuktikan bahwa semua nilai $_GET bertipe string: nilai "2" tercetak sebagai string(1) "2", dan baru berubah menjadi angka ketika dipakai operasi aritmetika berkat type juggling yang sudah kita bahas pada Section sebelumnya.

Menangani Method dalam Satu Handler #

Endpoint sungguhan biasanya menerima beberapa method sekaligus pada path yang sama: GET untuk menampilkan, POST untuk menambah, DELETE untuk menghapus. Pola penanganannya memetakan $_SERVER["REQUEST_METHOD"] ke aksi yang sesuai:

php
<?php
function tanganiPermintaan(string $method, array $get, array $post): string
{
    return match ($method) {
        "GET" => "Menampilkan data " . ($get["id"] ?? "semua"),
        "POST" => "Menyimpan data baru: " . ($post["judul"] ?? "-"),
        "PUT", "PATCH" => "Memperbarui data " . ($get["id"] ?? "-"),
        "DELETE" => "Menghapus data " . ($get["id"] ?? "-"),
        default => "Method $method belum didukung",
    };
}

echo tanganiPermintaan("GET", ["id" => "7"], []), "\n";
echo tanganiPermintaan("POST", [], ["judul" => "Belajar PHP"]), "\n";
echo tanganiPermintaan("PUT", ["id" => "7"], ["judul" => "Belajar PHP Edisi 2"]), "\n";
echo tanganiPermintaan("DELETE", ["id" => "7"], []), "\n";
echo tanganiPermintaan("HEAD", [], []), "\n";

Output yang Dihasilkan:

text
Menampilkan data 7
Menyimpan data baru: Belajar PHP
Memperbarui data 7
Menghapus data 7
Method HEAD belum didukung

Mari kita telaah struktur handler di atas:

  1. Baris 3: parameter $method menggantikan pembacaan langsung $_SERVER["REQUEST_METHOD"] — pola ini membuat fungsi bisa diuji dari CLI tanpa server sungguhan, cukup dengan mengirim nilai tiruan.
  2. Baris 5-10 (ekspresi match): setiap arm memetakan satu method ke aksinya; arm "PUT", "PATCH" mengelompokkan dua method karena keduanya berarti memperbarui data.
  3. Operator ??: memberi nilai cadangan ketika kunci tidak ada, sehingga handler tidak memicu Warning: Undefined array key.
  4. Arm default: method tak dikenal jatuh ke pesan penolakan — pada server sungguhan, cabang ini sebaiknya juga mengirim status 405 Method Not Allowed, seperti yang akan kita praktikkan sebentar lagi.

Method Spoofing dengan _method #

HTML form hanya mengenal GET dan POST, padahal aplikasi modern butuh PUT, PATCH, dan DELETE. Solusi yang sudah menjadi konvensi — dan dipakai Laravel — adalah method spoofing: form tetap dikirim sebagai POST, tetapi menyertakan field tersembunyi _method berisi method yang diinginkan. Server kemudian membaca field tersebut dan memperlakukan request seolah-olah dikirim dengan method itu:

php
<?php
function metodeEfektif(array $post): string
{
    if (isset($post["_method"])) {
        return strtoupper($post["_method"]);
    }

    return "POST";
}

$umpanBiasa = ["judul" => "Belajar PHP"];
$umpanPut = ["_method" => "put", "judul" => "Belajar PHP Edisi 2"];

echo metodeEfektif($umpanBiasa), "\n";
echo metodeEfektif($umpanPut), "\n";

Output yang Dihasilkan:

text
POST
PUT

Fungsi metodeEfektif() membaca $_POST (disimulasikan lewat parameter $post): bila kunci _method ada, nilainya dinormalkan ke huruf besar dengan strtoupper() dan dipakai sebagai method efektif; bila tidak ada, request memang POST biasa. Dengan dua pemanggilan terlihat jelas perbedaannya — form biasa menghasilkan POST, sedangkan form dengan field _method ditafsirkan sebagai PUT.

Menguji Method dengan curl #

Server web kecil berikut merangkum seluruh bab ini menjadi satu endpoint yang menangani beberapa method sekaligus:

php
<?php
$method = $_SERVER["REQUEST_METHOD"];

header("Content-Type: text/plain; charset=UTF-8");

switch ($method) {
    case "GET":
        echo "GET: menampilkan daftar produk";
        break;
    case "POST":
        $body = file_get_contents("php://input");
        echo "POST: menyimpan data baru ($body)";
        break;
    case "PUT":
        echo "PUT: memperbarui produk";
        break;
    case "DELETE":
        echo "DELETE: menghapus produk";
        break;
    default:
        http_response_code(405);
        echo "Method $method tidak didukung";
}

Simpan skrip di atas sebagai api.php di sebuah folder kosong, lalu nyalakan built-in server pada folder tersebut di terminal pertama:

bash
php -S 127.0.0.1:8099

Dari terminal kedua, kirim request dengan method yang berbeda-beda:

bash
curl -si -X GET http://127.0.0.1:8099/api.php
curl -si -X POST -d "nama=Kopi+Gayo&harga=45000" http://127.0.0.1:8099/api.php
curl -si -X PATCH http://127.0.0.1:8099/api.php

Opsi -X mengganti method (tanpa opsi ini curl memakai GET, atau POST ketika ada -d), -d mengirim body berformat form, dan -si menampilkan baris status beserta body. Berikut jawaban server untuk tiga request terakhir (header Host, Date, Connection, dan X-Powered-By diringkas karena isinya sama dengan chapter sebelumnya):

text
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8

POST: menyimpan data baru (nama=Kopi+Gayo&harga=45000)
text
HTTP/1.1 405 Method Not Allowed
Content-Type: text/plain; charset=UTF-8

Method PATCH tidak didukung

Request GET dan PUT dijawab 200 OK dengan body masing-masing (GET: menampilkan daftar produk dan PUT: memperbarui produk), persis mengikuti cabang switch yang dieksekusi. Body POST dibaca mentah lewat php://input — inilah satu-satunya jalan untuk method selain POST form, karena $_POST hanya terisi untuk tipe konten form. Request PATCH tidak punya cabang, sehingga handler menolaknya dengan http_response_code(405) — cara penolakan yang jauh lebih informatif daripada membalas 200 dengan pesan error di dalam body.

Ringkasan #

Method adalah kata kerja request: GET dan HEAD untuk membaca, POST untuk mengirim data baru, PUT dan PATCH untuk mengubah, DELETE untuk menghapus, dan OPTIONS untuk bertanya. Properti safe dan idempotent menentukan seberapa aman sebuah request diulang, dan kode server Anda wajib menghormati kontrak tersebut. PHP memetakan method lewat $_SERVER["REQUEST_METHOD"], data lewat $_GET, $_POST, dan php://input, sementara teknik _method menjembatani keterbatasan form HTML. Dari contoh terakhir kita melihat handler menolak PATCH dengan status 405 — angka tiga digit itu bukan hiasan, dan menjadi topik utama chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php
// contoh.php — rangkuman contoh Chapter "HTTP Methods"
// Jalankan dengan: php contoh.php

function tanganiPermintaan(string $method, array $get, array $post): string
{
    return match ($method) {
        "GET" => "Menampilkan data " . ($get["id"] ?? "semua"),
        "POST" => "Menyimpan data baru: " . ($post["judul"] ?? "-"),
        "PUT", "PATCH" => "Memperbarui data " . ($get["id"] ?? "-"),
        "DELETE" => "Menghapus data " . ($get["id"] ?? "-"),
        default => "Method $method belum didukung",
    };
}

function metodeEfektif(array $post): string
{
    if (isset($post["_method"])) {
        return strtoupper($post["_method"]);
    }

    return "POST";
}

echo "== Simulasi \$_GET dari query string ==\n";
$_GET["kategori"] = "buku";
$_GET["halaman"] = "2";
echo "Kategori: " . $_GET["kategori"] . "\n";
echo "halaman + 1 = " . ($_GET["halaman"] + 1) . "\n";

echo "\n== Penanganan method dalam satu handler ==\n";
echo tanganiPermintaan("GET", ["id" => "7"], []), "\n";
echo tanganiPermintaan("POST", [], ["judul" => "Belajar PHP"]), "\n";
echo tanganiPermintaan("PUT", ["id" => "7"], []), "\n";
echo tanganiPermintaan("DELETE", ["id" => "7"], []), "\n";
echo tanganiPermintaan("HEAD", [], []), "\n";

echo "\n== Method spoofing dengan _method ==\n";
echo metodeEfektif(["judul" => "Belajar PHP"]), "\n";
echo metodeEfektif(["_method" => "put", "judul" => "Belajar PHP Edisi 2"]), "\n";