JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

  1. Home
  2. Blog
  3. Softwareontwikkeling

Softwareontwikkeling

JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

Fetch is de ingebouwde manier om API’s vanuit JavaScript aan te roepen, maar er is één verrassing die bijna iedereen opvalt. Leer verzoeken te verzenden, elke vorm van mislukking af te handelen en een kleine helper te bouwen die u opnieuw kunt gebruiken.

9 min leestijd
JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

Belangrijkste punten

  • fetch() belooft een Response, en het lezen van het lichaam duurt een seconde await.
  • HTTP-fouten zoals 404 en 500 weigeren niet, dus controleer altijd response.ok.
  • Om JSON te verzenden, gebruikt u JSON.stringify en stelt u de header Content-Type in.
  • Fetch heeft geen standaard time-outoptie, dus gebruik AbortSignal.timeout().

De meeste moderne webapps praten voortdurend met een server. De JavaScript Fetch API is de standaardmanier om dat te doen, en deze is ingebouwd in browsers en in Node.js 18 en hoger, dus u hoeft niets te installeren.

Voor het basisgebruik zijn er twee regels nodig, maar veel tutorials stoppen daar en laten het deel weg dat echte bugs veroorzaakt: het afhandelen van fouten. We hebben de voorbeelden in deze handleiding getest met een kleine lokale server op Node.js 24, en de getoonde uitvoer is afkomstig van die run. example.com in de code staat voor je eigen API. Als beloften nieuw voor je zijn, begin dan met JavaScript-beloften uitgelegd.

Wat is de Fetch-API?

Fetch is een op beloften gebaseerde interface voor het doen van HTTP-verzoeken. Het verving het oudere, callback-gestuurde XMLHttpRequest, en veel projecten gebruiken het nu in plaats van een bibliotheek toe te voegen voor eenvoudige oproepen.

Functie Ophalen Axios (bibliotheek)
Installatie Ingebouwd Toegevoegd als afhankelijkheid
JSON-lichaam Teken het zelf Automatisch
JSON-antwoord parseren Bel response.json() Automatisch
HTTP-fouten weigeren? Nee Ja, standaard
Time-out Via AbortSignal Een timeout optie

Een GET-verzoek

Fetch maakt standaard een GET-verzoek. Er zijn twee stappen, en elke stap heeft await nodig: eerst komen de antwoordheaders binnen en dan lees je de hoofdtekst.

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

console.log(user);

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

Deze twee stappen bestaan ​​omdat de hoofdtekst groot kan zijn en later arriveert dan de headers. In een browserscript heeft topniveau await een module nodig, dus u plaatst deze meestal in een async functie. Zie onze JavaScript async/await-handleiding.

Het Response-object

Voordat u de hoofdtekst leest, kunt u het antwoord bekijken:

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

// 200 true application/json
Eigenschap of methode Geeft je
response.ok true voor statussen 200 t/m 299
response.status De statuscode, zoals 404
response.headers.get(name) Eén antwoordkop
response.json() De hoofdtekst wordt geparseerd als JSON
response.text() Het lichaam als touw
response.blob() Binaire gegevens, zoals een afbeelding

Een lichaam kan slechts één keer worden gelezen. Een tweede keer bellen naar json() mislukte in onze test:

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

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

Als u het toch twee keer wilt lezen, bel dan eerst response.clone().

De grote verrassing: een 404 gooit niet

Dit is het belangrijkste in dit artikel. We hebben een gebruiker gevraagd die niet bestaat:

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

// 404 false

Er werd geen uitzondering gemaakt. Wat het ophalen betreft, werkte het verzoek: de server werd bereikt en antwoordde. De belofte wordt alleen verworpen als er helemaal geen bruikbaar antwoord komt, zoals bij een netwerkstoring. Dus code als deze heeft een verborgen bug:

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
}

Bekijk ons spiekbriefje voor HTTP-statuscodes om te zien wat elke code betekent.

Een herbruikbare hulp

Herhaal die controle niet overal. Wikkel het een keer:

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

Nu komen HTTP-fouten en netwerkfouten beide in hetzelfde catch terecht. Deze kleine functie is de moeite waard in elk project. Een echte versie kan ook een foutmelding uit de antwoordtekst lezen en een 204 No Content antwoord afhandelen, dat geen JSON heeft om te parseren.

POST JSON-gegevens

Geef een optieobject door als tweede argument. Voor JSON moet je zelf twee dingen doen: de data omzetten naar een string en de header instellen.

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' }

Onze testserver echode het ontvangen inhoudstype terug en bevestigde dat de header was aangekomen. Het vergeten van die header is een veel voorkomende oorzaak van verwarrende serverfouten, omdat veel frameworks JSON alleen parseren wanneer deze wordt gedeclareerd. Om een ​​formulier of bestanden te uploaden, geeft u een FormData object door als hoofdtekst en stelt u niet Content-Type in, omdat de browser zelf een grenswaarde moet toevoegen.

Andere methoden en opties

Optie Voorbeeld Doel
methode "PUT", "PATCH", "DELETE" De HTTP-methode
kopteksten { Autorisatie: "Bearer..." } Vraag headers aan
lichaam JSON.stringify(data) De verzoektekst
signaal AbortSignal.timeout(5000) Annuleren
geloofsbrieven "opnemen" Cookies cross-origineel verzenden
cache "geen winkel" Gedrag van browsercache

Kiezen tussen REST en andere API-stijlen? Onze vergelijking van REST versus GraphQL laat zien hoe ophalen bij beide past.

Queryreeksen

Bouw geen queryreeksen door tekst samen te voegen, omdat speciale tekens deze kapot maken. URLSearchParams verzorgt de codering voor u:

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' }

De server heeft red shoes correct ontvangen en de ruimte is hersteld.

Time-outs en annuleren

Fetch zal lang wachten op een trage server, tenzij je anders vertelt. AbortSignal.timeout() stelt een limiet. Ons testeindpunt duurde twee seconden, tegen een limiet van 200 milliseconden:

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

// TimeoutError

Om handmatig te annuleren, bijvoorbeeld wanneer een gebruiker een pagina verlaat of een nieuwe zoekterm typt, gebruikt u een 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

Om meerdere verzoeken tegelijk uit te voeren, gebruikt u Promise.all, wat veel sneller is dan ze één voor één af te wachten:

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

Elke vorm van mislukking

Hier ziet u hoe elke mislukking er tijdens onze run uitzag, samen met hoe u ze van elkaar kunt onderscheiden:

Situatie Wat gebeurt er Hoe het te detecteren
Server retourneert 404 of 500 Belofte vervult response.ok is niet waar
Server kan niet worden bereikt Weigert met TypeError vangen
Time-out bereikt Weigert met TimeoutError error.name
Handmatig geannuleerd Weigert met AbortError error.name
De hoofdtekst is geen geldige JSON json() wijst af met SyntaxError vangen

Die laatste rij is gebruikelijk in de productie. Een proxy die een 502 retourneert, stuurt vaak een HTML-foutpagina. We reproduceerden dit en res.json() gooide een SyntaxError. Als u response.ok controleert voordat u gaat parseren, rapporteert u het echte probleem en niet een verwarrende parseerfout.

Tip: Test deze foutpaden expres. Browser-ontwikkelaarstools kunnen simuleren dat je offline bent, en testtools kunnen een 500-reactie nabootsen. In onze gids API-testen met Postman wordt de API-kant gecontroleerd.

CORS en referenties

In een browser is een verzoek van de ene oorsprong naar de andere onderworpen aan CORS, de regels voor het delen van bronnen tussen verschillende bronnen. Als u een fout ziet waarin Access-Control-Allow-Origin wordt vermeld, hoort de oplossing op de server te staan, die uw site moet toestaan. In uw JavaScript wordt de fout alleen als generiek weergegeven TypeError, dus kijk naar de browserconsole voor de werkelijke reden. Node.js dwingt CORS niet af, dus een verzoek dat in een script werkt, kan nog steeds mislukken in de browser.

Standaard verzenden browsers geen cookies bij cross-origin-verzoeken. Stel credentials: "include" in als u ze nodig heeft, en zorg ervoor dat de server dit toestaat. Plaats nooit geheime API-sleutels in browser-JavaScript, aangezien iedereen ze kan lezen. Bewaar ze op uw server.

Veel voorkomende fouten

  • Niet gecontroleerd response.ok. Foutreacties worden als succesvol beschouwd.
  • Het tweede await vergeten. response.json() levert ook een belofte op.
  • Vergeten JSON.stringify. Een object doorgeven zoals het lichaam verzendt [object Object].
  • Instelling Content-Type met FormData. Dit doorbreekt de grens, dus laat deze weg.
  • Er is geen time-out. Een vastgelopen verzoek kan de spinner van een pagina voor onbepaalde tijd laten draaien.
  • JSON wordt geparseerd voor een leeg antwoord. Een 204 heeft geen hoofdtekst en json() zal gooien.

Tot slot

Fetch is eenvoudig als je eenmaal de hoofdregel onthoudt: een reactie is niet hetzelfde als een succes. Kopieer de kleine helper naar uw project, voeg een time-out toe en test uw foutpaden. Bouw als volgende stap een kleine pagina die gegevens uit een API laadt, een duidelijke foutmelding weergeeft en de gebruiker een langzame zoekopdracht laat annuleren.

Veelgestelde vragen

Geeft fetch een foutmelding op een 404?

Nee. Ophalen wordt alleen afgewezen als er geen antwoord wordt ontvangen, bijvoorbeeld bij een netwerkstoring. Voor HTTP-fouten controleert u zelf response.ok of response.status.

Hoe verstuur ik JSON met fetch?

Stel de methode in op POST, voeg een Content-Type header van application/json toe en geef de gegevens door via JSON.stringify als hoofdtekst.

Waarom heb ik twee wachttijden nodig bij het ophalen?

De eerste wordt opgelost zodra de antwoordheaders arriveren. De tweede wacht tot de hoofdtekst is gedownload en geparseerd, wat later kan gebeuren.

Hoe stel ik een time-out in bij het ophalen?

Signaal doorgeven: AbortSignal.timeout(5000) in de opties. Het verzoek wordt vervolgens afgewezen met een TimeoutError als het langer duurt dan zoveel milliseconden.

Is ophalen beschikbaar in Node.js?

Ja. Fetch is wereldwijd beschikbaar in Node.js 18 en hoger. Oudere versies hebben een pakket nodig, hoewel CORS-regels alleen in browsers gelden.

Blijf leren

Werk met Stack Quora

Hulp nodig met testen, WordPress of SEO?

We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.

Blijf lezen

Meer handleidingen over testen, AI en moderne ontwikkeling

Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.

Kunstmatige intelligentie

AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen

AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…

Lees artikel →
DevOps

Omgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan

Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…

Lees artikel →
Softwareontwikkeling

API-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten

API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…

Lees artikel →
Testautomatisering

Spotten in Python: unittest.mock, patch en de fouten die tests doen liegen

Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…

Lees artikel →
Softwaretesten

Codedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent

Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…

Lees artikel →
Databases & SQL

DELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken

DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…

Lees artikel →
Databases & SQL

SQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…

Lees artikel →
Softwareontwikkeling

TypeScript-interface versus type: echte verschillen, getest met de compiler

TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…

Lees artikel →
Softwareontwikkeling

Python *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden

Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…

Lees artikel →
Softwareontwikkeling

Python Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken

Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…

Lees artikel →
Kunstmatige intelligentie

Wat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren

Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…

Lees artikel →
DevOps

Monitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen

Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…

Lees artikel →
DevOps

Docker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier

Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…

Lees artikel →
Testautomatisering

TDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt

TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…

Lees artikel →
Softwaretesten

Gebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden

Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…

Lees artikel →
Databases & SQL

SQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen

SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…

Lees artikel →
Databases & SQL

SQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten

SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…

Lees artikel →
Softwareontwikkeling

Wat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld

Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…

Lees artikel →
Softwareontwikkeling

JavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden

De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…

Lees artikel →
Softwareontwikkeling

Python-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden

Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …

Lees artikel →
Kunstmatige intelligentie

Wat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd

Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…

Lees artikel →
DevOps

Implementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen

Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…

Lees artikel →
Testautomatisering

Schilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen

Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…

Lees artikel →
Softwaretesten

Belastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden

Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …

Lees artikel →
Softwaretesten

Testcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken

Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…

Lees artikel →
Databases & SQL

Optimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing

Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…

Lees artikel →
Databases & SQL

SQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties

SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…

Lees artikel →
Softwareontwikkeling

JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…

Lees artikel →
Softwareontwikkeling

Python-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden

Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…

Lees artikel →
Softwareontwikkeling

Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.

Lees artikel →
Softwareontwikkeling

Python list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt

Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.

Lees artikel →
Databases & SQL

SQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)

Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.

Lees artikel →