Menu

Fetch API JavaScript: Request, JSON, dan Penanganan Error

Cara memakai Fetch API di JavaScript: request GET dan POST, parsing JSON, menangani error dengan benar, dan membatalkan request yang lambat.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Fetch Adalah HTTP Client Berbasis Promise

fetch sudah tersedia di browser dan Node modern. Kamu memberinya URL, dan ia mengembalikan Promise yang menghasilkan objek Response. Pada intinya, itulah seluruh API-nya:

Ada dua panggilan .then karena ada dua langkah asynchronous: pertama header response tiba (itulah hasil promise pertama), lalu body-nya dibaca dan di-parse (response.json() sendiri juga promise). Body-nya baru diunduh saat kamu memintanya.

Alur yang sama dengan async/await terbaca seperti kode biasa dari atas ke bawah:

Dua await, dua titik jeda. Pekerjaannya sama, urutan bacanya lebih jelas.

Objek Response

Yang kamu terima bukan body-nya, melainkan objek Response berisi metadata dan method untuk membaca body dalam berbagai bentuk:

Kamu bisa membaca body sebagai .json(), .text(), .blob(), .arrayBuffer(), atau .formData(). Masing-masing mengembalikan promise. Body hanya bisa dibaca sekali: panggil .json() dua kali pada response yang sama, maka panggilan kedua akan memunculkan error.

Jebakan Besar: Error HTTP Tidak Ditolak

Ini menjebak hampir semua orang yang baru mengenal fetch. Response 404 atau 500 bukan penolakan. Promise-nya selesai seperti biasa, dengan response.ok === false. Fetch hanya ditolak saat request itu sendiri tidak bisa diselesaikan, misalnya DNS gagal, tidak ada jaringan, atau diblokir CORS.

Artinya, fetch yang naif akan dengan senang hati memberimu halaman error lalu crash di .json() belakangan:

Solusinya, cek response.ok sendiri dan lempar error kalau server mengembalikan status error:

Biasakan menulis blok if (!response.ok) itu. Blok ini wajib ada di setiap wrapper fetch yang kamu tulis.

Mengirim Request POST

GET adalah default-nya. Untuk yang lain, berikan argumen kedua berupa objek options:

Tiga hal yang perlu dicatat:

  • method default-nya "GET". Atur secara eksplisit untuk POST, PUT, DELETE, PATCH.
  • body menerima string (atau FormData, Blob, dan sejenisnya). Fetch tidak akan melakukan serialisasi objek untukmu, jadi JSON.stringify(...) adalah tugasmu.
  • Header Content-Type memberi tahu server cara mem-parsing body. Kalau lupa, kebanyakan server akan memperlakukan body sebagai teks biasa.

Header, Query String, dan Opsi Lainnya

Header hanyalah sebuah objek (atau instance Headers). Query string kamu susun sendiri, biasanya dengan URLSearchParams:

URLSearchParams menangani encoding untukmu, seperti spasi, tanda ampersand, dan unicode, jadi URL-mu tidak rusak saat input berisi karakter yang perlu di-escape.

Opsi lain yang akan kamu lihat di kode sungguhan: credentials: "include" untuk mengirim cookie lintas origin, cache: "no-store" untuk melewati cache HTTP, dan mode: "cors" (biasanya default) untuk mengatur perilaku CORS.

Membatalkan Request dengan AbortController

Kadang kamu ingin menyerah, misalnya pengguna mengetik query pencarian baru, atau request-nya terlalu lama. AbortController adalah mekanismenya:

controller.abort() membuat promise fetch ditolak dengan DOMException yang name-nya "AbortError". Blok finally menghapus timeout-nya agar request yang berhasil tidak meninggalkan timer yang menggantung.

Pola ini, yaitu fetch ditambah timeout dan pembersihan, layak dibungkus dalam sebuah helper lalu dipakai ulang di mana-mana.

Wrapper yang Bisa Dipakai Ulang

Gabungkan semuanya, maka kamu mendapat helper kecil yang menangani boilerplate-nya sekali saja:

Satu tempat untuk mengubah header, satu tempat untuk menangani error, satu tempat untuk menangani response kosong. Setiap aplikasi yang tidak sepele pada akhirnya punya sesuatu seperti ini.

Berikutnya: Penanganan Error di Kode Async

Fetch adalah salah satu tempat paling umum munculnya error async, dan pengecekan response.ok hanyalah satu bagian dari teka-tekinya. Halaman berikutnya membahas penanganan error pada promise dan async/await: ke mana error pergi, cara menangkapnya, dan jebakan yang membuatnya lolos diam-diam.

Pertanyaan yang sering diajukan

Bagaimana cara memakai fetch di JavaScript?

Panggil fetch(url) dengan URL yang kamu inginkan. Hasilnya Promise yang menghasilkan objek Response. Panggil response.json() (juga sebuah promise) untuk mem-parsing isinya. Dengan async/await: const res = await fetch(url); const data = await res.json();.

Bagaimana cara mengirim request POST dengan fetch?

Berikan argumen kedua berisi method: 'POST', objek headers (biasanya 'Content-Type': 'application/json'), dan body. Ubah objek menjadi string dengan JSON.stringify(...), karena fetch tidak akan melakukan serialisasi body untukmu.

Mengapa fetch tidak ditolak saat 404 atau 500?

Fetch hanya ditolak saat ada kegagalan jaringan, seperti error DNS, tidak ada koneksi, atau diblokir CORS. Bagi promise-nya, status error HTTP tetap merupakan response yang berhasil. Kamu harus mengecek response.ok (true untuk 200 sampai 299) atau response.status sendiri dan melempar error kalau server mengembalikan error.

Bisakah aku membatalkan request fetch?

Bisa, dengan AbortController. Buat satu, berikan signal-nya ke fetch lewat objek options, lalu panggil controller.abort() saat ingin membatalkan. Promise fetch akan ditolak dengan AbortError yang bisa kamu tangani di catch.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai