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.
fetch()belooft eenResponse, en het lezen van het lichaam duurt een secondeawait.- HTTP-fouten zoals 404 en 500 weigeren niet, dus controleer altijd
response.ok. - Om JSON te verzenden, gebruikt u
JSON.stringifyen stelt u de headerContent-Typein. - 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
awaitvergeten.response.json()levert ook een belofte op. - Vergeten
JSON.stringify. Een object doorgeven zoals het lichaam verzendt[object Object]. - Instelling
Content-TypemetFormData. 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
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.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
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 →DevOpsOmgevingsvariabelen 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 →SoftwareontwikkelingAPI-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 →TestautomatiseringSpotten 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 →SoftwaretestenCodedekking 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 & SQLDELETE 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 & SQLSQL-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 →SoftwareontwikkelingTypeScript-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 →SoftwareontwikkelingPython *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 →SoftwareontwikkelingPython 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 intelligentieWat 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 →DevOpsMonitoring 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 →DevOpsDocker-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 →TestautomatiseringTDD 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 →SoftwaretestenGebruikersacceptatietesten (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 & SQLSQL 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 & SQLSQL 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 →SoftwareontwikkelingWat 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 →SoftwareontwikkelingJavaScript-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 →SoftwareontwikkelingPython-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 intelligentieWat 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 →DevOpsImplementatie 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 →TestautomatiseringSchilferige 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 →SoftwaretestenBelastingtesten 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 →SoftwaretestenTestcase 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 & SQLOptimalisatie 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 & SQLSQL 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 →SoftwareontwikkelingJavaScript 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 →SoftwareontwikkelingPython-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 →SoftwareontwikkelingGit 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 →SoftwareontwikkelingPython 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 & SQLSQL 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 →