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:

text Percakapan HTTP mentah
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 :

MethodPeranContoh pemakaian
GETMembaca sumber daya tanpa mengubah apa punMengambil daftar tugas
POSTMengirim data baru untuk diprosesMembuat tugas baru
PUTMengganti sumber daya secara utuhMenimpa isi tugas nomor 42
PATCHMengubah sebagian sumber dayaMenandai tugas selesai
DELETEMenghapus sumber dayaMenghapus tugas nomor 42
HEADSeperti GET tetapi tanpa bodyMengecek 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:

KelasArtiContoh
1xxInformasi, proses masih berjalan101 Switching Protocols
2xxSukses200 OK, 201 Created, 204 No Content
3xxPengalihan, klien perlu tindakan lanjutan301, 302, 304 Not Modified
4xxKlien melakukan kesalahan400, 401, 403, 404, 429
5xxServer mengalami kegagalan500 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:

js
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:

text
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 Unavailable

Mari kita telaah baris-baris kode di atas:

  1. Baris 1 (import http from 'node:http'): kita memuat module http bawaan Node.js — module yang sama akan kita pakai untuk membangun server pada chapter berikutnya.
  2. Baris 3 (const pilihan = [...]): array berisi status code yang ingin kita periksa, mencakup lima kelas sehingga polanya terlihat.
  3. Baris 5-7 (for...of): setiap kode dicetak bersama teks statusnya dari http.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:

VersiTahunCiri utama
HTTP/1.01996Satu request per koneksi TCP, lalu koneksi ditutup
HTTP/1.11997Keep-alive bawaan, header Host wajib, chunked transfer
HTTP/22015Format biner, multiplexing, kompresi header
HTTP/32022Berjalan 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.