Tutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu

  1. Beranda
  2. Blog
  3. Pengembangan Perangkat Lunak

Pengembangan Perangkat Lunak

Tutorial JavaScript Fetch API: GET, POST, Penanganan Kesalahan, dan Batas Waktu

Fetch adalah cara bawaan untuk memanggil API dari JavaScript, namun ada satu kejutan yang menarik perhatian hampir semua orang. Belajar mengirim permintaan, menangani setiap jenis kegagalan, dan membangun alat bantu kecil yang dapat Anda gunakan kembali.

9 menit baca
Tutorial JavaScript Fetch API: GET, POST, penanganan kesalahan, dan batas waktu

Poin penting

  • fetch() mengembalikan janji untuk Response, dan membaca isi memerlukan waktu beberapa detik await.
  • Kesalahan HTTP seperti 404 dan 500 jangan ditolak, jadi selalu periksa response.ok.
  • Untuk mengirim JSON, gunakan JSON.stringify dan atur header Content-Type.
  • Pengambilan tidak memiliki opsi batas waktu default, jadi gunakan AbortSignal.timeout().

Sebagian besar aplikasi web modern berkomunikasi dengan server sepanjang waktu. JavaScript Fetch API adalah cara standar untuk melakukan hal itu, dan sudah terpasang di browser dan di Node.js 18 dan yang lebih baru, jadi tidak ada yang perlu diinstal.

Penggunaan dasar membutuhkan dua baris, namun banyak tutorial berhenti di situ dan mengabaikan bagian yang menyebabkan bug sebenarnya: penanganan kegagalan. Kami menguji contoh dalam panduan ini terhadap server lokal kecil di Node.js 24, dan output yang ditampilkan berasal dari proses tersebut. example.com dalam kode adalah singkatan dari API Anda sendiri. Jika janji merupakan hal baru bagi Anda, mulailah dengan penjelasan janji JavaScript.

Apa itu Ambil API?

Fetch adalah antarmuka berbasis janji untuk membuat permintaan HTTP. Ini menggantikan yang lama, berbasis panggilan balik XMLHttpRequest, dan banyak proyek sekarang menggunakannya daripada menambahkan perpustakaan untuk panggilan sederhana.

Fitur Ambil Aksio (perpustakaan)
Instalasi Dibangun di Ditambahkan sebagai ketergantungan
badan JSON Merangkainya sendiri Otomatis
Parsing respons JSON Panggilan response.json() Otomatis
Kesalahan HTTP ditolak? Tidak Ya, secara default
Batas waktu Melalui AbortSignal Pilihan timeout.

Permintaan DAPATKAN

Fetch membuat permintaan GET secara default. Ada dua langkah, dan masing-masing langkah memerlukan await: pertama header respons tiba, lalu Anda membaca isi.

const response = await fetch("https://example.com/users/1");
const user = await response.json();

console.log(user);

// { id: 1, name: 'Asha' }

Kedua langkah tersebut ada karena badannya mungkin besar dan tiba lebih lambat dari header. Dalam skrip browser, await tingkat atas memerlukan modul, jadi Anda biasanya akan memasukkannya ke dalam fungsi async. Lihat panduan async/tunggu JavaScript kami.

Objek Respon

Sebelum Anda membaca isi isi, Anda dapat memeriksa tanggapannya:

console.log(response.status, response.ok, response.headers.get("content-type"));

// 200 true application/json
Properti atau metode Memberimu
response.ok true untuk status 200 hingga 299
response.status Kode status, seperti 404
response.headers.get(name) Satu tajuk tanggapan
response.json() Tubuh diurai sebagai JSON
response.text() Tubuh sebagai string
response.blob() Data biner, seperti gambar

Tubuh hanya dapat dibaca satu kali. Memanggil json() untuk kedua kalinya gagal dalam pengujian kami:

await res.json();
await res.json();

// TypeError: Body is unusable: Body has already been read

Jika Anda perlu membacanya dua kali, panggil response.clone() terlebih dahulu.

Kejutan besarnya: 404 tidak bisa dilempar

Ini adalah hal terpenting dalam artikel ini. Kami meminta pengguna yang tidak ada:

const res = await fetch("https://example.com/users/999");
console.log(res.status, res.ok);

// 404 false

Tidak terkecuali dilempar. Sejauh menyangkut pengambilan, permintaan berhasil: server telah dijangkau dan dijawab. Janji tersebut ditolak hanya ketika tidak ada respons yang dapat digunakan sama sekali, seperti kegagalan jaringan. Jadi kode seperti ini memiliki bug tersembunyi:

try {
  const res = await fetch(url);
  const data = await res.json();   // may be an error payload
  showUser(data);                  // runs anyway for 404 and 500
} catch (error) {
  showError();                     // does not run for 404 or 500
}

Periksa lembar contekan kode status HTTP kami untuk mengetahui arti setiap kode.

Pembantu yang dapat digunakan kembali

Jangan ulangi pemeriksaan itu di mana pun. Bungkus sekali:

async function getJson(url, options) {
  const response = await fetch(url, options);
  if (!response.ok) {
    throw new Error(`Request failed with status ${response.status}`);
  }
  return response.json();
}

try {
  await getJson("https://example.com/users/999");
} catch (error) {
  console.log("caught:", error.message);
}

// caught: Request failed with status 404

Sekarang kesalahan HTTP dan kesalahan jaringan keduanya berakhir di tempat yang sama catch. Fungsi kecil ini layak dimiliki di setiap proyek. Versi sebenarnya mungkin juga membaca pesan kesalahan dari isi respons, dan menangani respons 204 No Content, yang tidak memiliki JSON untuk diurai.

POST data JSON

Berikan objek opsi sebagai argumen kedua. Untuk JSON, Anda harus melakukan dua hal sendiri: mengonversi data menjadi string dan menyetel header.

const created = await getJson("https://example.com/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Ben" }),
});

console.log(created);

// { id: 2, name: 'Ben', type: 'application/json' }

Server pengujian kami mengulangi jenis konten yang diterimanya, mengonfirmasi bahwa header telah tiba. Lupa bahwa header adalah penyebab umum kesalahan server yang membingungkan, karena banyak kerangka kerja hanya mengurai JSON ketika dideklarasikan. Untuk mengunggah formulir atau file, teruskan objek FormData sebagai isi, dan jangan jangan setel Content-Type, karena browser perlu menambahkan nilai batas itu sendiri.

Metode dan opsi lain

Pilihan Contoh Tujuan
metode "PUT", "PATCH", "DELETE" Metode HTTP
header {Otorisasi: "Pembawa..." } Minta header
tubuh JSON.stringify(data) Badan permintaan
sinyal AbortSignal.timeout(5000) Membatalkan
kredensial "termasuk" Mengirim cookie lintas asal
tembolok "tidak ada toko" Perilaku cache browser

Memilih antara REST dan gaya API lainnya? Perbandingan kami mengenai REST vs GraphQL menunjukkan bagaimana pengambilan cocok dengan masing-masingnya.

String kueri

Jangan membuat string kueri dengan menggabungkan teks, karena karakter khusus akan merusaknya. URLSearchParams menangani pengkodean untuk Anda:

const params = new URLSearchParams({ q: "red shoes", page: 2 });
console.log(params.toString());

// q=red+shoes&page=2

await getJson(`https://example.com/search?${params}`);

// { q: 'red shoes', page: '2' }

Server menerima red shoes dengan benar, dengan ruang dipulihkan.

Batas waktu dan pembatalan

Pengambilan akan menunggu lama di server yang lambat kecuali Anda memberitahukannya sebaliknya. AbortSignal.timeout() menetapkan batas. Titik akhir pengujian kami memerlukan waktu dua detik, dibandingkan batas 200 milidetik:

try {
  await fetch("https://example.com/slow", { signal: AbortSignal.timeout(200) });
} catch (error) {
  console.log(error.name);
}

// TimeoutError

Untuk membatalkan secara manual, misalnya saat pengguna meninggalkan halaman atau mengetikkan istilah pencarian baru, gunakan AbortController:

const controller = new AbortController();
const pending = fetch("https://example.com/slow", { signal: controller.signal });

controller.abort();

try {
  await pending;
} catch (error) {
  console.log(error.name);
}

// AbortError

Untuk menjalankan beberapa permintaan sekaligus, gunakan Promise.all, yang jauh lebih cepat daripada menunggunya satu per satu:

const [user, search] = await Promise.all([
  getJson("https://example.com/users/1"),
  getJson("https://example.com/search?q=a&page=1"),
]);

Setiap jenis kegagalan

Berikut tampilan setiap kegagalan yang kami jalankan, beserta cara membedakannya:

Situasi Apa yang terjadi Bagaimana cara mendeteksinya
Server mengembalikan 404 atau 500 Janji terpenuhi response.ok salah
Server tidak dapat dijangkau Menolak dengan TypeError menangkap
Batas waktu tercapai Menolak dengan TimeoutError error.name
Dibatalkan secara manual Menolak dengan AbortError error.name
Isi bukan JSON yang valid json() menolak dengan SyntaxError menangkap

Baris terakhir itu biasa terjadi dalam produksi. Proksi yang mengembalikan 502 sering kali mengirimkan halaman kesalahan HTML. Kami mereproduksi ini, dan res.json() melemparkan SyntaxError. Memeriksa response.ok sebelum penguraian berarti Anda melaporkan masalah sebenarnya, bukan kesalahan penguraian yang membingungkan.

Kiat: Uji jalur kegagalan ini dengan sengaja. Alat pengembang browser dapat mensimulasikan keadaan offline, dan alat pengujian dapat meniru respons 500. Panduan Pengujian API dengan Tukang Pos kami mencakup pemeriksaan sisi API.

CORS dan kredensial

Di browser, permintaan dari satu asal ke asal lainnya tunduk pada CORS, aturan berbagi sumber daya lintas asal. Jika Anda melihat kesalahan yang menyebutkan Access-Control-Allow-Origin, perbaikan ada di server, yang harus mengizinkan situs Anda. Di JavaScript Anda, kegagalan hanya muncul secara umum TypeError, jadi lihat konsol browser untuk mengetahui alasan sebenarnya. Node.js tidak menerapkan CORS, jadi permintaan yang berfungsi dalam skrip masih bisa gagal di browser.

Secara default, browser tidak mengirimkan cookie pada permintaan lintas asal. Atur credentials: "include" jika Anda membutuhkannya, dan pastikan server mengizinkannya. Jangan pernah menaruh kunci API rahasia di browser JavaScript, karena siapa pun dapat membacanya. Simpan di server Anda.

Kesalahan umum

  • Tidak memeriksa response.ok. Respons kesalahan dianggap berhasil.
  • Melupakan yang kedua await. response.json() juga mengembalikan janji.
  • Lupa JSON.stringify. Melewati suatu objek saat tubuh mengirimkan [object Object].
  • Mengatur Content-Type dengan FormData. Ini melanggar batas, jadi tinggalkan saja.
  • Tidak ada batas waktu. Permintaan yang digantung dapat membuat pemintal halaman berjalan tanpa batas waktu.
  • Mengurai JSON untuk respons kosong. A 204 tidak memiliki isi, dan json() akan dilempar.

Penutup

Pengambilan itu sederhana setelah Anda mengingat aturan utamanya: respons tidak sama dengan kesuksesan. Salin pembantu kecil ke dalam proyek Anda, tambahkan batas waktu dan uji jalur kegagalan Anda. Sebagai langkah selanjutnya, buat halaman kecil yang memuat data dari API, menampilkan pesan kesalahan yang jelas, dan memungkinkan pengguna membatalkan pencarian yang lambat.

Pertanyaan yang sering diajukan

Apakah pengambilan menimbulkan kesalahan pada 404?

Tidak. pengambilan hanya ditolak bila tidak ada tanggapan yang diterima, misalnya pada kegagalan jaringan. Untuk kesalahan HTTP, periksa sendiri respon.ok atau respon.status.

Bagaimana cara mengirim JSON dengan pengambilan?

Setel metode ke POST, tambahkan header Tipe Konten aplikasi/json, dan teruskan data melalui JSON.stringify sebagai isi.

Mengapa saya perlu dua menunggu dengan pengambilan?

Yang pertama terselesaikan setelah header respons tiba. Yang kedua menunggu isi diunduh dan diurai, yang bisa terjadi nanti.

Bagaimana cara menetapkan batas waktu pengambilan?

Lewati sinyal: AbortSignal.timeout(5000) di opsi. Permintaan kemudian ditolak dengan TimeoutError jika memerlukan waktu lebih lama dari milidetik tersebut.

Apakah pengambilan tersedia di Node.js?

Ya. Pengambilan tersedia secara global di Node.js 18 dan yang lebih baru. Versi lama memerlukan paket, meskipun aturan CORS hanya berlaku di browser.

Teruslah belajar

Bekerja dengan Stack Quora

Butuh bantuan dengan pengujian, WordPress atau SEO?

Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.

Teruslah membaca

Panduan lebih lanjut tentang pengujian, AI & pengembangan modern

Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.

Kecerdasan buatan

Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya

Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…

Baca artikel →
DevOps

Penjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar

Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan

Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…

Baca artikel →
Otomatisasi pengujian

Mengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong

Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…

Baca artikel →
Pengujian perangkat lunak

Penjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya

Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…

Baca artikel →
Basis data & SQL

DELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing

DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…

Baca artikel →
Basis data & SQL

Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…

Baca artikel →
Pengembangan perangkat lunak

Antarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler

Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas

Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…

Baca artikel →
Pengembangan perangkat lunak

Fungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan

Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…

Baca artikel →
Kecerdasan buatan

Apa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan

Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…

Baca artikel →
DevOps

Pemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak

Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…

Baca artikel →
DevOps

Volume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar

Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…

Baca artikel →
Otomatisasi pengujian

TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing

TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…

Baca artikel →
Pengujian perangkat lunak

User Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata

Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…

Baca artikel →
Basis data & SQL

Penjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari

Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …

Baca artikel →
Basis data & SQL

Pernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum

SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …

Baca artikel →
Pengembangan perangkat lunak

Apa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja

Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh

Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…

Baca artikel →
Pengembangan perangkat lunak

Generator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata

Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…

Baca artikel →
Kecerdasan buatan

Apa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana

Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…

Baca artikel →
DevOps

Penerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih

Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…

Baca artikel →
Otomatisasi pengujian

Tes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan

Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …

Baca artikel →
Pengujian perangkat lunak

Load Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6

Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…

Baca artikel →
Pengujian perangkat lunak

Kasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing

Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…

Baca artikel →
Basis data & SQL

Optimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu

Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…

Baca artikel →
Basis data & SQL

SQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji

SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…

Baca artikel →
Pengembangan perangkat lunak

Tutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu

Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…

Baca artikel →
Pengembangan perangkat lunak

Penanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh

Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…

Baca artikel →
Pengembangan perangkat lunak

Git merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing

Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.

Baca artikel →
Pengembangan perangkat lunak

List Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari

List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.

Baca artikel →
Basis data & SQL

Penjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)

Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.

Baca artikel →