Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 4 · Modul 4 dari 15

HTTP Request Lengkap: GET, POST, Header, Batch, Upload

Menguasai modul k6/http: seluruh metode, parameter, objek Response, request paralel, unggah berkas, dan penanganan cookie.

Modul k6/http

Semua metode HTTP tersedia dan memakai pola argumen yang konsisten.

metode.jsjavascript
import http from 'k6/http';

http.get(url, params);
http.post(url, body, params);
http.put(url, body, params);
http.patch(url, body, params);
http.del(url, body, params);      // perhatikan: del, bukan delete (kata kunci JS)
http.head(url, params);
http.options(url, body, params);
http.request('REPORT', url, body, params);   // metode kustom apa pun

Objek params — Semua Opsi Penting

params.jsjavascript
const params = {
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + token,
    'X-Request-Id': uuidv4(),
  },
  tags: { name: 'GetUserById' },   // WAJIB untuk URL dinamis, lihat pitfall
  timeout: '10s',                  // default 60 detik — terlalu longgar
  redirects: 5,                    // berapa redirect diikuti (0 = tidak diikuti)
  compression: 'gzip',
  responseType: 'text',            // 'text' | 'binary' | 'none'
  jar: myCookieJar,                // cookie jar khusus
};

Mengirim Body: Tiga Bentuk yang Berbeda

Ini sumber kebingungan yang sering terjadi. Bentuk body menentukan Content-Type yang dikirim.

❌ Salah — object polos untuk API JSON
javascript
// Ini dikirim sebagai application/x-www-form-urlencoded,
// BUKAN JSON. API modern akan menolak dengan 400/422.
http.post(url, { nama: 'Budi', umur: 30 });
✅ Benar — JSON eksplisit
javascript
http.post(url, JSON.stringify({ nama: 'Budi', umur: 30 }), {
  headers: { 'Content-Type': 'application/json' },
});
Bentuk bodyContent-Type yang dikirimUntuk apa
{ a: 1 } (object)application/x-www-form-urlencodedForm HTML klasik
JSON.stringify({...}) + headerapplication/jsonREST API modern
new FormData()multipart/form-dataUnggah berkas
String mentahSesuai header yang Anda setXML, SOAP, plain text

Objek Response — Yang Perlu Anda Tahu

response.jsjavascript
const res = http.get(url);

res.status;              // 200
res.status_text;         // "200 OK"
res.body;                // isi respons (string)
res.json();              // parse JSON -> object
res.json('data.items.0.id');   // ambil langsung dengan path (aman dari error)
res.headers['Content-Type'];
res.cookies;
res.url;                 // URL final setelah redirect
res.error;               // pesan error tingkat jaringan
res.error_code;          // kode error k6 (0 bila tidak ada)

// Rincian waktu — inilah sumber angka metrik http_req_*
res.timings.duration;         // total = sending + waiting + receiving
res.timings.blocked;          // menunggu slot koneksi
res.timings.connecting;       // TCP handshake
res.timings.tls_handshaking;  // TLS handshake
res.timings.sending;          // mengirim request
res.timings.waiting;          // TTFB — waktu berpikir server (paling penting!)
res.timings.receiving;        // mengunduh isi respons
💡 waiting vs duration — bedakan salah siapa

waiting (TTFB) adalah waktu server memproses. receiving adalah waktu mengunduh. Bila duration tinggi tapi waiting rendah, masalahnya bukan di kode backend melainkan di ukuran respons atau bandwidth. Ini menghemat berjam-jam salah tuduh antar tim.

Request Paralel dengan http.batch()

Browser memuat banyak aset sekaligus. Untuk menirunya, gunakan batch — semua request berangkat bersamaan.

batch.jsjavascript
const responses = http.batch([
  ['GET', BASE + '/api/profil',   null, { tags: { name: 'Profil' } }],
  ['GET', BASE + '/api/notifikasi', null, { tags: { name: 'Notif' } }],
  ['GET', BASE + '/api/keranjang', null, { tags: { name: 'Keranjang' } }],
]);

check(responses[0], { 'profil ok': (r) => r.status === 200 });

Unggah Berkas

upload.jsjavascript
import { FormData } from 'https://jslib.k6.io/formdata/0.0.2/index.js';

// WAJIB di init context — open() tidak boleh di dalam default()
const gambar = open('./data/foto.jpg', 'b');

export default function () {
  const fd = new FormData();
  fd.append('judul', 'Foto Produk');
  fd.append('berkas', http.file(gambar, 'foto.jpg', 'image/jpeg'));

  http.post(BASE + '/api/unggah', fd.body(), {
    headers: { 'Content-Type': 'multipart/form-data; boundary=' + fd.boundary },
  });
}