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 punObjek 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 body | Content-Type yang dikirim | Untuk apa |
|---|---|---|
{ a: 1 } (object) | application/x-www-form-urlencoded | Form HTML klasik |
JSON.stringify({...}) + header | application/json | REST API modern |
new FormData() | multipart/form-data | Unggah berkas |
| String mentah | Sesuai header yang Anda set | XML, 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 siapawaiting (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 },
});
}