Sebelum menulis web server pertama, kita perlu memahami bahasa yang dipakai browser dan server untuk berkomunikasi: HTTP (Hypertext Transfer Protocol). Setiap kali kita membuka halaman web, mengunduh berkas, atau memanggil API dari kode, pertukaran data tersebut berlangsung lewat HTTP. Module http pada Node.js sebenarnya adalah penerjemah bahasa tersebut: module ini menerima pesan HTTP mentah dari jaringan, lalu menyajikannya sebagai object JavaScript yang mudah kita olah. Pada chapter ini kita bedah anatomi pesan HTTP, method, status code, dan versi-versi protokolnya sebagai bekal untuk semua chapter berikutnya.
Karakter Dasar HTTP #
HTTP adalah protokol request-response: klien mengirim satu request, server membalas dengan satu response, lalu percakapan selesai. Tiga karakter HTTP yang perlu kita pegang:
- Berbasis teks: pesan HTTP/1.1 tersusun dari baris teks yang bisa dibaca manusia, sehingga kita bisa memeriksa isi percakapan langsung.
- Stateless: server tidak menyimpan ingatan tentang request sebelumnya. Setiap request dibaca seolah-olah berasal dari klien yang belum pernah dikenal.
- Berjalan di atas TCP: request dan response dikirim melalui koneksi TCP; port standar HTTP adalah 80, sedangkan HTTPS memakai port 443 dengan enkripsi TLS.
Anatomi Pesan HTTP #
Sebuah request HTTP terdiri dari empat bagian: request line berisi method, jalur, dan versi protokol; kumpulan header berupa pasangan nama-nilai; satu baris kosong sebagai penanda; lalu body yang opsional. Response mengikuti pola yang sama, hanya baris pertamanya berisi versi protokol, status code, dan teks status. Pembahasan lengkap tiap bagian pesan tersedia di referensi MDN tentang pesan HTTP . Perhatikan bentuk percakapan mentah berikut:
GET /tugas/42 HTTP/1.1
Host: example.com
User-Agent: klien-kita/1.0
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 31
{"id":42,"judul":"Belajar HTTP"}Baris GET /tugas/42 HTTP/1.1 adalah request line: method GET, jalur /tugas/42, dan versi HTTP/1.1. Baris Host, User-Agent, dan Accept adalah header request; Host wajib ada pada HTTP/1.1 karena satu alamat IP bisa melayani banyak domain. Baris kosong setelah header menandai akhir bagian header sekaligus awal body. Pada response, Content-Type memberi tahu format body, sedangkan Content-Length menyatakan ukuran body dalam byte. Nama header tidak peka huruf besar-kecil — content-type dan Content-Type dianggap sama.
Method HTTP #
Method menyatakan niat klien terhadap sumber daya di jalur yang dituju. Tabel berikut merangkum method yang paling sering kita pakai — daftar lengkap beserta sifat keamanannya terdokumentasi di MDN tentang method HTTP :
| Method | Peran | Contoh pemakaian |
|---|---|---|
GET | Membaca sumber daya tanpa mengubah apa pun | Mengambil daftar tugas |
POST | Mengirim data baru untuk diproses | Membuat tugas baru |
PUT | Mengganti sumber daya secara utuh | Menimpa isi tugas nomor 42 |
PATCH | Mengubah sebagian sumber daya | Menandai tugas selesai |
DELETE | Menghapus sumber daya | Menghapus tugas nomor 42 |
HEAD | Seperti GET tetapi tanpa body | Mengecek ketersediaan berkas |
Method GET dan HEAD tidak boleh membawa efek samping — klien boleh memanggil keduanya berulang kali tanpa mengubah keadaan server. Method POST, PUT, PATCH, dan DELETE biasanya menyertakan body berisi data yang dikirim.
Status Code #
Setiap response membawa status code tiga digit yang melaporkan hasil request. Daftar lengkap setiap kode terdokumentasi di MDN tentang status respons HTTP ; kita cukup menghafal kelasnya:
| Kelas | Arti | Contoh |
|---|---|---|
| 1xx | Informasi, proses masih berjalan | 101 Switching Protocols |
| 2xx | Sukses | 200 OK, 201 Created, 204 No Content |
| 3xx | Pengalihan, klien perlu tindakan lanjutan | 301, 302, 304 Not Modified |
| 4xx | Klien melakukan kesalahan | 400, 401, 403, 404, 429 |
| 5xx | Server mengalami kegagalan | 500 Internal Server Error, 503 |
Node.js menyediakan tabel teks status bawaan di object http.STATUS_CODES, sehingga kita bisa memeriksa arti setiap kode tanpa membuka dokumentasi:
import http from 'node:http';
const pilihan = [200, 201, 204, 301, 302, 400, 401, 403, 404, 429, 500, 503];
for (const kode of pilihan) {
console.log(String(kode).padEnd(4), http.STATUS_CODES[kode]);
}Output yang Dihasilkan:
200 OK
201 Created
204 No Content
301 Moved Permanently
302 Found
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
429 Too Many Requests
500 Internal Server Error
503 Service UnavailableMari kita telaah baris-baris kode di atas:
- Baris 1 (
import http from 'node:http'): kita memuat modulehttpbawaan Node.js — module yang sama akan kita pakai untuk membangun server pada chapter berikutnya. - Baris 3 (
const pilihan = [...]): array berisi status code yang ingin kita periksa, mencakup lima kelas sehingga polanya terlihat. - Baris 5-7 (
for...of): setiap kode dicetak bersama teks statusnya darihttp.STATUS_CODES;padEnd(4)menjaga kolom tetap rapi karena kode bisa tiga digit.
Versi HTTP #
HTTP berevolusi beberapa kali, dan perbedaan versi memengaruhi cara koneksi dikelola:
| Versi | Tahun | Ciri utama |
|---|---|---|
| HTTP/1.0 | 1996 | Satu request per koneksi TCP, lalu koneksi ditutup |
| HTTP/1.1 | 1997 | Keep-alive bawaan, header Host wajib, chunked transfer |
| HTTP/2 | 2015 | Format biner, multiplexing, kompresi header |
| HTTP/3 | 2022 | Berjalan di atas QUIC (UDP), bukan TCP |
Pada HTTP/1.1, koneksi bisa dipakai ulang untuk banyak request secara bergantian melalui mekanisme keep-alive, tetapi request tetap diantre satu per satu per koneksi. HTTP/2 mengubah format pesan menjadi biner dan memperkenalkan multiplexing: banyak request dan response berjalan paralel di satu koneksi yang sama, sehingga halaman dengan puluhan berkas tidak lagi mengantre. Server HTTP bawaan Node.js berbicara HTTP/1.1; dukungan HTTP/2 tersedia melalui module node:http2 untuk kebutuhan yang lebih lanjut.
Dengan pemahaman anatomi pesan, method, status code, dan versi HTTP di tangan, kita siap berpindah ke sisi praktik. Ringkasan menyeluruh protokol ini juga bisa dibaca kapan saja di ikhtisar HTTP di MDN
. Langkah berikutnya adalah membangun server HTTP pertama dengan http.createServer, tempat semua konsep ini berubah menjadi object req dan res yang bisa kita olah langsung — itu topik Chapter HTTP Server Dasar.