JavaScript
fetch - hent data fra et API
fetch er den indbyggede måde at hente data fra en anden tjeneste. Du giver den en adresse, venter på svaret, laver svaret om fra JSON til et objekt, og bruger så dataene. Det tager tid, så kaldet skrives med async og await.
Forudsætter, at du har set asynkron javascript , json .
Formen, du skal kunne udenad
Næsten alle API-kald i første semester ser sådan her ud:
async function hentData() {
const svar = await fetch("https://eksempel.dk/api/data");
if (!svar.ok) {
throw new Error("Serveren svarede " + svar.status);
}
const data = await svar.json();
return data;
}
Fire linjer, fire ting:
fetch(adresse)sender forespørgslen.awaitventer på, at svaret kommer.svar.okertrue, hvis statuskoden er i 200-serien. Tjek den,fetchkaster nemlig ikke selv en fejl ved 404 eller 500.svar.json()læser indholdet og fortolker det som JSON. Den tager også tid, så ogsåawait.- Nu har du et almindeligt objekt eller array, du kan arbejde med.
To gange await, og hvorfor
Det forvirrer næsten alle: hvorfor skal der ventes to gange? Fordi der er to adskilte ting, der tager tid. Først skal serveren svare. Det er den første. Så skal svarets indhold læses færdigt og fortolkes. Det er den anden.
Glemmer du den anden, får du et promise i stedet for dine data, og alt hvad du
prøver at læse ud af det, bliver undefined.
Simulering, du kan køre her
Der er ikke netadgang i eksempelfeltet her på siden, så nedenstående efterligner et svar. Formen er den samme som i din opgave.
function hentLigesomFetch() {
const jsonTekst = '{"by":"København","temp":17.4}';
return new Promise((indfri) => {
setTimeout(() => indfri({ ok: true, status: 200, json: () => JSON.parse(jsonTekst) }), 300);
});
}
async function vis() {
try {
const svar = await hentLigesomFetch();
if (!svar.ok) {
throw new Error("Serveren svarede " + svar.status);
}
const data = await svar.json();
console.log("Det er " + data.temp + " grader i " + data.by);
} catch (fejl) {
console.log("Noget gik galt: " + fejl.message);
}
}
vis(); Output
Tryk på “Kør koden”.
At sende data den anden vej
Skal du sende noget, typisk indholdet af en formular, giver du fetch et
ekstra objekt med metode, headers og indhold:
const svar = await fetch("https://eksempel.dk/api/studerende", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ navn: "Ida", alder: 21 })
});
body skal være tekst, ikke et objekt. Derfor
JSON.stringify. Og Content-Type fortæller serveren,
hvordan den skal læse teksten. Mere om metoderne under
HTTP.
CORS-fejlen
Prøver du at hente fra et andet domæne, end din side kører på, kan browseren blokere det med en besked om CORS. Det er ikke en fejl i din kode: serveren i den anden ende har ikke givet lov til, at netop din side læser dens svar. Løsningen ligger hos den server, eller i at bruge et API, der tillader det.
Kort opsamling
await fetch(...), tjeksvar.ok,await svar.json().- To
awaitfordi to ting tager tid. fetchkaster ikke fejl ved 404 og 500.- Send data med
method,headersog enbody, der er tekst.
Læs videre
- Hvad er et API? Hvad er et API? Forklaret på dansk uden fagsprog, med et konkret eksempel på et kald, hvordan svaret ser ud, og hvad en API-nøgle er til.
- JSON Hvad er JSON? Forklaret på dansk med eksempler. Forskellen på JSON og et JavaScript-objekt, og hvordan du bruger JSON.parse og JSON.stringify.
- HTTP-statuskoder HTTP-statuskoder forklaret på dansk: 200, 301, 400, 401, 403, 404 og 500. Hvad de betyder, og hvem der har problemet. Dig eller serveren.
Senest gennemgået .