Daten abrufen und Browser-APIs

Lerne, mit fetch Daten zu laden und zu senden, die Ergebnisse auf einer Webseite anzuzeigen und kleine Datenmengen im Browser zu speichern. Du liest HTTP-Anfragen, HTTP-Antworten und JSON, behandelst Lade- und Fehlerzustände und formatierst Datumsangaben und Preise aus einer API passend für die jeweiligen Leser. Du erfährst, warum CORS-Fehler auftreten und warum geheime API-Schlüssel nicht in den Frontend-Code gehören. Anschließend nutzt du localStorage, sessionStorage und Browserfunktionen wie die Standortermittlung und die Zwischenablage.

AnfängerEinheit 8 von 9 in Kurs: JavaScript – DOM, Ereignisse und asynchroner Code

Was du lernst

  1. Erkläre, wie eine HTTP-Anfrage und eine HTTP-Antwort funktionieren, lade JSON-Daten mit fetch und sende Daten mit der passenden Methode sowie den passenden Headern und dem passenden Anfragekörper an eine API.
    • Lies HTTP-Anfragen und HTTP-Antworten
      Beschreibe die Bestandteile einer HTTP-Anfrage und einer HTTP-Antwort, ordne jede HTTP-Methode der Aktion zu, die sie ausführt, und lies Statuscodes und Header in den Entwicklerwerkzeugen des Browsers.
    • Lade JSON-Daten mit fetch
      Rufe fetch auf, prüfe den Status der Antwort, lies und parse den JSON-Antwortkörper und erstelle Anfrage-URLs mit korrekt kodierten Abfrageparametern.
    • Sende Daten mit POST, PUT, PATCH und DELETE
      Übergib fetch ein Optionsobjekt, um JSON oder Formulardaten zu senden, und behandle die Antwort des Servers nach dem Erstellen, Aktualisieren oder Löschen eines Datensatzes.
  2. Wandle API-Ergebnisse in Seiteninhalte um, formatiere Datumsangaben und Geldbeträge passend für die Leser und halte die Seite übersichtlich, während Daten laden, das Laden fehlschlägt oder Daten in anderer Reihenfolge eintreffen.
    • Rendere API-Ergebnisse auf der Seite
      Erstelle Seitenelemente aus den Arrays und Objekten einer JSON-Antwort, füge API-Text sicher ein und behandle fehlende Felder, leere Ergebnisse und seitenweise gelieferte Ergebnisse.
    • Formatiere Datumsangaben, Zahlen und Geldbeträge aus API-Daten
      Wandle die Datumszeichenketten, Zeitstempel und Beträge, die APIs senden, mit den Intl-Formatierern in lesbaren Text für Sprache, Region und Zeitzone der Leser um.
    • Zeige Ladezustände, Fehlerzustände und Leerzustände an
      Verfolge die Phasen einer Anfrage, zeige dem Nutzer für jede Phase eine klare Meldung und setze die Verarbeitung nach Fehlern mit Wiederholungsversuchen fort.
    • Brich Anfragen ab, begrenze ihre Wartezeit und kombiniere sie
      Brich nicht mehr benötigte Anfragen ab, setze Zeitlimits, verhindere, dass veraltete Antworten neuere ersetzen, und führe mehrere Anfragen parallel oder nacheinander aus.
  3. Erkläre die Same-Origin-Policy und CORS-Fehler und schütze API-Schlüssel und Nutzerdaten, wenn eine Seite mit anderen Servern kommuniziert.
    • Verstehe die Same-Origin-Policy und CORS
      Bestimme den Ursprung einer URL, erkläre, warum der Browser manche Antworten anderer Ursprünge blockiert, und erkenne, wie ein Server sie mit CORS-Headern und Preflight-Anfragen erlauben kann.
    • Schütze API-Schlüssel und Nutzerdaten
      Erkläre, wozu API-Schlüssel und Token dienen, warum ein Geheimnis im Frontend-Code öffentlich ist und wie du Anmeldeinformationen sendest und verantwortungsvoll mit Nutzerdaten umgehst.
  4. Speichere, lies und aktualisiere kleine Datenmengen mit localStorage und sessionStorage und entscheide, was sich sinnvoll und sicher im Browser aufbewahren lässt.
    • Speichere und lies Daten mit localStorage und sessionStorage
      Nutze die Web-Storage-Methoden, erkläre, wie lange die jeweilige Speicherart erhalten bleibt und wer sie lesen kann, und wandle Zahlen, boolesche Werte und Objekte in gespeicherte Zeichenketten und zurück um.
    • Nutze Browserspeicher in einer Anwendung
      Stelle gespeicherte Zustände beim Laden einer Seite wieder her, speichere API-Antworten mit einer Ablaufzeit zwischen, halte Tabs synchron und entscheide, was nicht gespeichert werden sollte.
  5. Erkenne und nutze Browser-APIs, die eine sichere Seite oder die Berechtigung des Nutzers benötigen, etwa für die Standortermittlung und die Zwischenablage, und biete Nutzern eine Rückfalllösung, wenn eine Funktion nicht verfügbar ist.
    • Ermittle den Standort des Nutzers mit der Geolocation-API
      Prüfe, ob eine Browser-API verfügbar ist, erkläre sichere Kontexte und Berechtigungsanfragen und nutze die Geolocation-API mit ihren Optionen, Fehlern und einer Rückfalllösung.
    • Kopiere Text und nutze weitere Browser-APIs
      Kopiere Text mit der Clipboard-API, reagiere auf Änderungen der Netzwerkverbindung, lies Parameter aus der Seitenadresse und nutze eine Methode, um beliebige neue Browser-APIs kennenzulernen.

Daten abrufen und Browser-APIs einfach erklärt

5 Kapitel

1

Stelle Anfragen und lies die Antworten

Eine Seite kann Daten von einem Server anfordern, ohne eine neue Seite zu laden. Die Anfrage gibt an, welche Ressource du möchtest und was du damit tun willst; die Antwort sagt dir, was passiert ist. Du verfolgst diesen Austausch im Netzwerk-Tab, wandelst eine JSON-Antwort in JavaScript-Daten um und sendest Änderungen an den Server zurück. Die wichtigen Prüfpunkte sind die Methode, der Status und die Struktur des Antwortkörpers: Dass eine Antwort eintrifft, bedeutet allein noch nicht, dass die Operation erfolgreich war.

1.1 Die Bestandteile eines HTTP-Austauschs

Eine Web-API lässt ein Programm Daten über benannte URLs lesen oder verändern, die Endpunkte heißen. Das JavaScript auf der Seite ist der Client. Es sendet eine HTTP-Anfrage; der Server antwortet mit einer HTTP-Antwort. Viele APIs senden JSON-Text, der Objekte, Arrays, Zeichenketten, Zahlen, boolesche Werte und null darstellen kann.

Eine Anfrage lesen

Betrachte GET https://api.example.com/books?author=Le%20Guin&limit=5. Die Methode ist GET, der Pfad /books wählt die Ressource aus und die Abfragezeichenkette enthält zwei Parameter. Der Wert von author ist „Le Guin“; %20 kodiert das Leerzeichen. Ein kaufmännisches Und trennt die Parameter. Die API-Dokumentation erklärt, welche Parameternamen sie akzeptiert und was die einzelnen Werte bedeuten.

Eine Anfrage kann außerdem Header enthalten, also Name-Wert-Paare, sowie einen Anfragekörper mit den übermittelten Daten. Accept: application/json fordert eine JSON-Antwort an. Content-Type: application/json beschreibt den gesendeten Körper. Authorization übermittelt Anmeldeinformationen. Bei Headernamen spielt die Groß- und Kleinschreibung keine Rolle, sodass content-type und Content-Type denselben Header bezeichnen.

Die Aktion wählen
MethodeBeabsichtigte AktionTypische Verwendung
GETLesenEine Liste von Notizen abrufen
POSTErstellen oder übermittelnEine Notiz hinzufügen
PUTErsetzenDie vollständige Ersatznotiz senden
PATCHTeilweise ändernEine Notiz als erledigt markieren
DELETEEntfernenEine Notiz löschen

GET und HEAD sind sichere Methoden: Ihr vorgesehener Zweck ist das Lesen. Verwende GET daher nicht für eine Löschschaltfläche. GET, PUT und DELETE sind idempotent. Wird dieselbe Anfrage wiederholt, bleibt der Server im selben beabsichtigten Zustand wie nach einmaliger Ausführung. Das Löschen einer bereits gelöschten Notiz kann einen anderen Status zurückgeben, aber die Notiz bleibt gelöscht. Ein wiederholtes POST kann einen zweiten Datensatz erstellen.

Die Antwort deuten

Die Antwort enthält einen Statuscode, Header und normalerweise einen Antwortkörper. Die erste Ziffer ordnet das Ergebnis einer Gruppe zu:

  • 2xx: Erfolg. 200 OK enthält üblicherweise Daten, 201 Created meldet die Erstellung und 204 No Content hat keinen Antwortkörper.
  • 3xx: Weiterleitung. Standardmäßig folgt fetch Weiterleitungen.
  • 4xx: ein Problem mit der Anfrage oder dem Zugriff. 400 bedeutet fehlerhafte Anfrage; 401 bedeutet fehlende oder ungültige Anmeldeinformationen; 403 bedeutet, dass der Server die Anfrage versteht, aber verweigert; 404 bedeutet nicht gefunden; 429 bedeutet zu viele Anfragen.
  • 5xx: ein Serverproblem, etwa 500 Internal Server Error oder 503 Service Unavailable.

Ein Aufruf von /books/42 könnte 200, einen JSON-Inhaltstyp und {"id":42,"title":"The Dispossessed","year":1974} zurückgeben. Ein Aufruf von /books/9999 könnte 404 und {"error":"Book not found"} zurückgeben. Beide Aufrufe erhielten eine Antwort. Bei einem Verbindungsfehler gibt es keinen HTTP-Status, den JavaScript prüfen könnte.

Prüfen statt raten

Öffne die Entwicklerwerkzeuge, wähle Netzwerk und löse die Aktion aus. Untersuche Methode, vollständige URL, Status, Header, Körper und Zeitangaben. Vergleiche sie mit dem Endpunkt, den erforderlichen Parametern, Anmeldeinformationen, Ratenbegrenzungen und der Beispielantwort in der Dokumentation. Hat der Server die richtigen Daten zurückgegeben, untersuche den Seitencode; ist die Anfrage-URL falsch, korrigiere sie, bevor du die Renderfunktion änderst.

Wichtige Erkenntnisse

  • Ein Endpunkt ist eine URL, die eine API für eine Operation bereitstellt.
  • Die Methode wählt die Aktion; die URL wählt die Ressource und die Parameter.
  • Anfrage- und Antwortheader beschreiben den Austausch.
  • Ein 404 ist eine Antwort, während ein Verbindungsfehler keinen HTTP-Status hat.
  • Untersuche den Netzwerk-Tab und vergleiche den Austausch mit der API-Dokumentation.

1.2 Lade JSON in zwei asynchronen Schritten

fetch(url) sendet eine GET-Anfrage und gibt ein Promise zurück. Dessen Ergebnis ist ein Response-Objekt, das verfügbar ist, sobald die Header eintreffen. Das Lesen des Antwortkörpers ist eine separate asynchrone Operation. response.json() liest diesen Körper und parst ihn in JavaScript-Daten.

Warten, prüfen, lesen
async function loadBook(id) {
  const response = await fetch(`https://api.example.com/books/${id}`);
  if (!response.ok) {
    throw new Error(`HTTP error ${response.status}`);
  }
  return await response.json();
}

Bei loadBook(42) erhält das erste await die Antwort. Die Bedingung weist ein nicht erfolgreiches HTTP-Ergebnis zurück. Das zweite await erhält das geparste Buch, etwa { id: 42, title: "The Dispossessed", year: 1974 }. Die Funktion selbst gibt ein Promise zurück, sodass auch der aufrufende Code auf das Ergebnis wartet.

response.ok ist bei Statuscodes von 200 bis einschließlich 299 wahr. Ein HTTP-Fehler wie 404 oder 500 führt nicht zur Ablehnung des fetch-Promises: Ein Server hat geantwortet. Ein Netzwerkfehler, ein durch CORS blockierter Austausch, eine ungültige Anfrage-URL oder ein Abbruch können es ablehnen. Wenn du bei !response.ok einen Fehler auslöst, kann ein umgebendes try/catch auch HTTP-Fehler behandeln.

Den Antwortkörper verstehen

Ohne await speichert const data = response.json() ein Promise und nicht das Buch. Der Zugriff auf data.title ergibt dann undefined. Lässt du await bei fetch weg, bleibt ebenso ein Promise dort, wo der Code ein Response-Objekt erwartet.

Wähle die zur Antwort passende Methode zum Lesen des Körpers: json() für JSON, text() für Text oder blob() für Binärdaten. Ein Körper kann nur einmal gelesen werden. Speichere das geparste Ergebnis und verwende es erneut. Um auch den rohen JSON-Text zu untersuchen, lies text() einmal und rufe dann JSON.parse(text) für diese gespeicherte Zeichenkette auf.

Ungültiges JSON führt zur Ablehnung mit einem SyntaxError. Eine HTML-Fehlerseite verursacht oft eine Meldung wie „Unexpected token '<'“. Auch ein leerer Körper, etwa bei einer 204-Antwort, lässt sich nicht als JSON parsen. Prüfe zuerst den Status und untersuche response.headers.get("Content-Type"), wenn das Format unklar ist. Ein Erfolgsstatus allein garantiert keinen JSON-Antwortkörper.

Eine Abfrage sicher erstellen
const url = new URL("https://api.example.com/search");
url.searchParams.set("q", "rock & roll");
url.searchParams.set("limit", 10);

Die resultierende Adresse ist https://api.example.com/search?q=rock+%26+roll&limit=10. Das enthaltene kaufmännische Und wird als Teil des Werts kodiert. Hängst du Eingaben an "?q=" an, können &, # oder + ihre URL-Bedeutung erhalten und die Suche verändern. Eine relative URL wird nach den üblichen Regeln aufgelöst: Von https://notes.example.org/app/index.html aus lädt fetch("data/books.json") den Pfad /app/data/books.json auf diesem Ursprung.

Der zurückgegebenen Struktur folgen

Bei {"results":[{"title":"Dune"}],"total":1} ist der erste Titel data.results[0].title. Das äußere Objekt ist nicht das Ergebnisarray. Nutze die Antwortvorschau, um das Array zu finden, bevor du es durchläufst.

Eine gemeinsam verwendete Hilfsfunktion getJSON(url, options) kann für viele Aufrufe dieselbe Statusprüfung und dasselbe Lesen des Antwortkörpers übernehmen. Gib in einer .then()-Kette response.json() aus dem Antwort-Callback zurück, damit der nächste Callback geparste Daten erhält. Hänge am Ende .catch() an, um abgelehnte Schritte zu behandeln.

Wichtige Erkenntnisse

  • fetch und response.json() geben separate Promises zurück.
  • Prüfe response.ok; ein HTTP-Fehler führt nicht zur Ablehnung von fetch.
  • Lies einen Antwortkörper einmal und verwende den gespeicherten Wert erneut.
  • Verwende URL.searchParams, um Abfragewerte zu kodieren.
  • Lies verschachteltes JSON entsprechend seiner tatsächlichen Objekt- und Arraystruktur.
  • Auch eine erfolgreiche Antwort kann einen leeren oder ungültigen JSON-Antwortkörper enthalten.

1.3 Sende eine Änderung und nutze das Ergebnis des Servers

Das zweite Argument von fetch konfiguriert eine Anfrage. Zu seinen Optionen gehören method, headers, body, signal und credentials. Ohne diese Optionen ist die Anfrage ein GET ohne Anfragekörper. Um JSON zu übermitteln, musst du sowohl den Text als auch seinen Inhaltstyp vorbereiten.

JSON senden
const response = await fetch("https://api.example.com/notes", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ title: "Shopping", text: "Rice, lentils" }),
});

JSON.stringify erzeugt {"title":"Shopping","text":"Rice, lentils"}. Der Header sagt dem Server, wie er diesen Text lesen soll. Wird das Objekt direkt als Anfragekörper übergeben, wird "[object Object]" gesendet. Wird die JSON-Zeichenkette ohne den Header gesendet, wird sie als text/plain;charset=UTF-8 gekennzeichnet. Viele JSON-Endpunkte lehnen dies mit 400 oder 415 Unsupported Media Type ab.

Eine erfolgreiche Erstellung gibt oft 201 mit dem gespeicherten Datensatz zurück, etwa {"id":17,"title":"Shopping","text":"Rice, lentils"}. Nutze dieses zurückgegebene Objekt, um die Seite zu aktualisieren: Die neue id des Servers wird für spätere Bearbeitungen und das Löschen benötigt.

Ersetzen oder aktualisieren
AnfrageAnfragekörperBedeutung
PATCH /notes/17{"done":true}Das übermittelte Feld ändern
PUT /notes/17Die vollständige ErsatznotizDie Ressource ersetzen
DELETE /notes/17Oft keinerDie Ressource entfernen

Fehlt in einem PUT-Anfragekörper ein Feld, kann dieses Feld je nach API entfernt oder zurückgesetzt werden. Verwende für die beabsichtigte Änderung die dokumentierte Methode. PUT und PATCH können einen aktualisierten Datensatz mit 200 oder 204 ohne Antwortkörper zurückgeben.

Behandle den Erfolg, ohne anzunehmen, dass immer JSON folgt:

if (!response.ok) {
  throw new Error(`HTTP error ${response.status}`);
}
const saved = response.status === 204
  ? null
  : await response.json();

Dieses Muster passt zu Endpunkten, die laut Dokumentation entweder JSON oder 204 zurückgeben. Ein Löschvorgang kann erfolgreich sein und dennoch einen Parserfehler erzeugen, wenn der Code auf dem leeren Antwortkörper blind json() aufruft.

Das Format des Anfragekörpers wählen

new FormData(formElement) sammelt benannte Formularfelder und ausgewählte Dateien. Übergib das Ergebnis direkt als body. Lass den Browser Content-Type: multipart/form-data und dessen Trennzeichen setzen; bei einem manuell angegebenen Header kann das Trennzeichen fehlen, das zur Trennung der Felder benötigt wird. Ein URLSearchParams-Anfragekörper verwendet application/x-www-form-urlencoded.

Anfragen mit GET und HEAD können über fetch keinen Anfragekörper übertragen. Setze Suchbegriffe und Filter in die Abfragezeichenkette der URL. Der Versuch, GET mit einem Anfragekörper zu verwenden, wird mit einem TypeError abgelehnt, bevor er als Suchanfrage dienen kann.

Nach Erfolg oder Fehler sicher abschließen

Deaktiviere die Absende-Schaltfläche, bevor du auf eine Anfrage zum Erstellen wartest, und aktiviere sie dann in finally wieder. Ein Doppelklick kann sonst zwei POST-Anfragen senden und zwei Datensätze erstellen. Wiederhole einen Erstellvorgang mit ungewissem Ausgang nicht automatisch: Eine verlorene Antwort sagt nicht aus, ob der Server die Änderung vorgenommen hat.

Bei einem Fehlerstatus kann der Antwortkörper eine nützliche Meldung wie {"error":"title is required"} enthalten. Lies ihn einmal, wenn er JSON enthält; fange einen fehlgeschlagenen Parsvorgang ab und behalte bei leeren oder HTML-Antworten eine allgemeine HTTP-Meldung bei. Lass den vom Nutzer eingegebenen Text verfügbar, damit er die Anfrage korrigieren kann.

Wichtige Erkenntnisse

  • JSON-Anfragen benötigen JSON.stringify und einen passenden Inhaltstyp.
  • Verwende PATCH für eine teilweise Änderung und PUT für einen vollständigen Ersatz.
  • Überspringe das Parsen von JSON bei 204 No Content.
  • Lass den Browser beim Senden von FormData den Multipart-Header setzen.
  • Nutze die Antwort des Servers einschließlich der vergebenen ID, um die Seite zu aktualisieren.
  • Verhindere mehrfaches Absenden und stelle die Bedienelemente in finally wieder her.
2

Mache aus Antworten eine nützliche Seite

Das Abrufen von Daten ist nur der erste Teil einer Benutzeroberfläche. Leser brauchen nützliche Ergebnisse, lesbare Datumsangaben und Preise sowie eine klare Meldung, während sie warten. Du baust die Anzeige anhand der Antwortstruktur auf, verhinderst, dass fehlende Werte sie beschädigen, und machst Erfolge, leere Ergebnisse und Fehler sichtbar. Außerdem steuerst du überlappende Anfragen, damit eine langsame Antwort keine neueren Ergebnisse ersetzen kann, und entscheidest, wann unabhängige Anfragen gleichzeitig laufen können.

2.1 Erstelle die Anzeige aus Daten

Rendern wandelt ein Array oder Objekt in Elemente auf der Seite um. Speichere die abgerufenen Daten in einer Variablen und übergib sie einer Renderfunktion. Durch diese Trennung kannst du dieselben Daten sortieren oder filtern, ohne sie erneut vom Server anzufordern.

Ein Element pro Eintrag erstellen
function renderBooks(books, list) {
  list.replaceChildren();
  for (const book of books) {
    const item = document.createElement("li");
    item.textContent = `${book.title} (${book.year})`;
    list.append(item);
  }
}

Für [{"title":"Kindred","year":1979},{"title":"Beloved","year":1987}] entstehen zwei Listeneinträge: „Kindred (1979)“ und „Beloved (1987)“. Wird der Container zuerst geleert, ersetzt eine neue Suche die vorherige. Ohne diesen Schritt sammeln sich die alten und neuen Listen an.

Externen Text als Text behandeln

Verwende textContent für API-Titel, Beschreibungen und andere Texte. innerHTML parst eine Zeichenkette als Markup. Ein Titel mit <img src="x" onerror="alert(1)"> kann dann Code ausführen. Das ist Cross-Site-Scripting, kurz XSS. Text aus Formularen und Speicher muss ebenso behandelt werden, weil auch er aus einer nicht vertrauenswürdigen Quelle stammen kann.

Elementeigenschaften setzen einzelne Werte, etwa img.alt = book.title. Sie machen aber nicht automatisch jede Art von Wert sicher. Ein von der API gelieferter Link benötigt weiterhin eine Protokollprüfung:

try {
  const target = new URL(book.url, location.href);
  if (target.protocol === "https:" || target.protocol === "http:") {
    link.href = target.href;
  }
} catch {
  link.removeAttribute("href");
}

Dieser Code wird für einen neu erstellten Link ohne vorhandenes href ausgeführt. Bei einer ungültigen oder nicht erlaubten URL bleibt er ohne Ziel. Eine javascript:-URL ist keine gewöhnliche Webnavigation. Gib für Bilder einen aussagekräftigen alt-Text an, den du nach Möglichkeit aus den Daten erstellst.

Standardwerte setzen, ohne echte Werte zu verlieren

Optionale Felder können fehlen oder null sein. book.author?.name ?? "Unknown author" versucht zuerst, den verschachtelten Namen zu lesen, und liefert andernfalls einen Standardwert. Die optionale Verkettung verhindert den Zugriff auf eine Eigenschaft eines fehlenden Autors.

Der Operator ist entscheidend: 0 || "n/a" ergibt "n/a", während 0 ?? "n/a" den Wert 0 beibehält. Der Operator || ersetzt alle Falsy-Werte, einschließlich null und einer leeren Zeichenkette; ?? ersetzt nur null und undefined. Bei einem Buch mit null verfügbaren Exemplaren muss null angezeigt werden.

Ein leeres Ergebnisarray ist eine erfolgreiche Suche ohne Treffer. Zeige „Keine Bücher entsprechen deiner Suche“ an, damit Leser dies von einer Seite unterscheiden können, die noch nicht geladen wurde.

Eine Suche ersetzen, eine weitere Seite anhängen

Viele APIs liefern Seiten mit page, limit, einer Gesamtzahl total oder einer next-URL. Bei 47 Ergebnissen und 10 pro Seite enthalten vier volle Seiten 40 Datensätze und die fünfte 7. Eine neue Suche leert die vorherige Liste; „Mehr laden“ hängt die nächste Seite an die aktuelle Liste an. Halte diese beiden Anzeigeaktionen getrennt.

Um eine lokale Kopie mit den neuesten Einträgen zuerst zu sortieren, verwende [...books].sort((a, b) => b.year - a.year) und rendere diese Kopie. Der Spread erstellt ein neues Array, sodass die gespeicherte Reihenfolge der Antwort verfügbar bleibt. Untersuche die Antwortstruktur, bevor du das Array auswählst: Eine API mit Paginierung legt es oft in data.results ab.

Wichtige Erkenntnisse

  • Rendere aus gespeicherten Daten, damit lokales Sortieren keine neue Anfrage benötigt.
  • Füge nicht vertrauenswürdigen Text mit textContent ein.
  • Validiere das Protokoll eines API-Links, bevor du sein Ziel zuweist.
  • Verwende ?. für fehlende verschachtelte Daten und ??, wenn null erhalten bleiben muss.
  • Ersetze Ergebnisse bei einer neuen Suche; hänge Ergebnisse für eine weitere Seite an.

2.2 Formatiere Datumsangaben und Beträge für Menschen

APIs geben Werte zurück, die Programme leicht austauschen können. Leser brauchen Datumsangaben, Uhrzeiten und Beträge, die für ihre Sprache und Region formatiert sind. Halte den gespeicherten Wert von dem Text für seine Anzeige getrennt.

Zuerst das Datumsformat lesen

"2026-03-05T14:30:00Z" bezeichnet einen Zeitpunkt: den 5. März 2026 um 14:30 Uhr UTC. Das Z bedeutet UTC. new Date(...) wandelt ihn in ein JavaScript-Date um. Eine Zeichenkette nur mit Datum wie "2026-03-05" wird als Mitternacht UTC interpretiert; ein Datum mit Uhrzeit ohne Versatz wie "2026-03-05T14:30" wird als Ortszeit interpretiert.

Ein Unix-Zeitstempel zählt ab dem 1. Januar 1970, UTC. APIs zählen oft Sekunden, aber Date erwartet Millisekunden. new Date(1772721000 * 1000) ergibt denselben Zeitpunkt am 5. März. Lässt du die Multiplikation weg, erhältst du ein Datum im Januar 1970. Lies die API-Dokumentation, um die Einheit zu bestimmen.

Gebietsschema und Zeitzone wählen
const date = new Date("2026-03-05T14:30:00Z");
const dateFormat = new Intl.DateTimeFormat("en-US", {
  dateStyle: "medium",
  timeStyle: "short",
  timeZone: "UTC",
});
dateFormat.format(date);

Die Ausgabe ist „Mar 5, 2026, 2:30 PM“. Mit en-GB ist sie „5 Mar 2026, 14:30“. Bei kurzen Datumsformaten entsteht „3/5/26“ in en-US, „05/03/2026“ in en-GB und „05.03.26“ in de-DE.

Das Gebietsschema steuert die Darstellung; die Zeitzone bestimmt die lokale Uhrzeit. Ohne timeZone verwendet der Formatierer die Zeitzone des Geräts. Dieser Zeitpunkt ist 9:30 Uhr in New York, 15:30 Uhr in Amsterdam und 23:30 Uhr in Tokio. Speichere und sende Zeitpunkte in UTC und wandle sie für die Anzeige um. Bei einem Kalenderdatum wie einem Geburtstag ist Vorsicht nötig: Wird Mitternacht UTC in einer Zeitzone westlich von UTC formatiert, kann der vorherige Tag erscheinen.

Währung und Gebietsschema getrennt halten
const priceFormat = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "EUR",
});
priceFormat.format(1234.5);

Das ergibt €1,234.50. Für denselben Betrag ergibt de-DE mit EUR 1.234,50 €; en-US mit USD ergibt $1,234.50; en-US mit JPY ergibt ¥1,235. JPY hat keine Währungsuntereinheit, daher hat seine übliche Anzeige keine Dezimalstellen. Die Wahl eines Gebietsschemas rechnet keine Währungen um. Verwende den Währungscode, der mit dem Betrag geliefert wird.

Manche Zahlungs-APIs senden ganzzahlige Währungsuntereinheiten. Bei USD bedeuten 1999 Cent 19.99 US-Dollar: Dividiere vor dem Formatieren durch 100. Wende diesen Divisor nicht auf JPY an. Das Addieren ganzzahliger Centbeträge ergibt 1999 + 2550 = 4549, was als $45.49 formatiert wird. So vermeidest du das bekannte Ergebnis der Dezimalrechnung 0.1 + 0.2, nämlich 0.30000000000000004.

Den Formatierer wiederverwenden

Erstelle für eine Liste einmal einen Formatierer. Verwende undefined als Gebietsschema, um die Standardeinstellung des Browsers zu wählen; navigator.language meldet das bevorzugte Sprachkürzel des Browsers. Andere Optionen formatieren 0.256 als „26%“ oder 12.5 mit der Einheit "kilometer-per-hour" als „12.5 km/h“. new Intl.RelativeTimeFormat("en", { numeric: "auto" }).format(-1, "day") ergibt „yesterday“. Von Hand erstellte Datumsangaben wie „03/05/2026“ bleiben über Regionen hinweg mehrdeutig.

Wichtige Erkenntnisse

  • Prüfe, ob Zeitstempel Sekunden oder Millisekunden verwenden.
  • Eine ausdrücklich angegebene Zeitzone macht die Anzeige von Datum und Uhrzeit vorhersehbar.
  • Das Gebietsschema steuert die Formatierung; die Währung stammt aus den Daten.
  • Wandle dokumentierte Währungsuntereinheiten um, bevor du Geldbeträge formatierst.
  • Verwende Intl-Formatiererobjekte innerhalb einer Liste erneut.
  • Zeichenketten nur mit Datum werden als UTC geparst und können bei der Anzeige in einer anderen Zeitzone den Tag wechseln.

2.3 Zeige, was die Anfrage gerade tut

Eine Anfrage hat einen sichtbaren Lebenszyklus: inaktiv, lädt, dann Erfolg oder Fehler. Ein Erfolg kann Daten oder ein leeres Ergebnis enthalten. Die Seite sollte jeden Zustand erklären, damit Leser wissen, ob sie warten, eine Suche ändern oder es erneut versuchen sollen.

Vorbereitung und Aufräumen zusammenhalten

In diesem Handler prüft getJSON den HTTP-Status und parst den Antwortkörper, searchUrl erstellt die Anfrage-URL und renderResults aktualisiert die Liste. Die Schaltfläche und das Statuselement sind bereits auf der Seite vorhanden.

async function search(query) {
  button.disabled = true;
  status.textContent = "Loading…";
  try {
    const data = await getJSON(searchUrl(query));
    renderResults(data.results);
    status.textContent = data.results.length === 0 ? "No results." : "";
  } catch (error) {
    status.textContent = "Could not load results. Check your connection and try again.";
    console.error(error);
  } finally {
    button.disabled = false;
  }
}

Die Vorbereitung erfolgt vor dem Warten. Der Erfolgszweig rendert Ergebnisse und behandelt ein leeres Array. Der catch-Block ersetzt die Lademeldung, falls einer der erwarteten Schritte fehlschlägt. finally stellt die Schaltfläche nach beiden Wegen wieder her. Stünde das Aufräumen nur nach einem erfolgreichen await, bliebe das Bedienelement bei einem Fehler deaktiviert.

Die hilfreiche Ursache erklären

Ein HTTP-Fehler hat einen Status, an dem sich die Meldung orientieren kann. Teile bei 404 mit, dass der Eintrag nicht gefunden wurde. Bitte den Nutzer bei 401, sich anzumelden; erkläre bei 403, dass der Zugriff nicht erlaubt ist. Bitte ihn bei 429 zu warten. Erkläre bei 5xx, dass der Dienst ein Problem hat, und schlage einen späteren Versuch vor.

Ein TypeError von fetch kann einen Netzwerkfehler, eine blockierte CORS-Anfrage oder eine fehlerhafte URL bedeuten. JavaScript erhält keine zuverlässige detaillierte CORS-Diagnose; untersuche die Browserkonsole und den Netzwerk-Tab. Ein SyntaxError von json() weist auf ungültiges JSON hin. Abbrüche und Zeitlimits erzeugen Fehler wie AbortError und TimeoutError. Belasse technische Details in der Konsole und gib Lesern eine verständliche Handlungsmöglichkeit.

Änderungen bemerkbar machen

Verwende ein vorhandenes Statuselement wie <p role="status"></p>. Seine Änderungen werden Screenreadern angesagt, ohne den Fokus zu verschieben. aria-live="polite" dient einem ähnlichen Zweck; role="alert" eignet sich für dringende Fehler. Ein Ladesymbol allein vermittelt weder ein leeres Ergebnis noch eine fehlgeschlagene Anfrage.

Eine Schaltfläche „Erneut versuchen“ ruft die Ladefunktion erneut auf. Werden Anfragen mit 400 oder 404 unverändert wiederholt, tritt das Problem meist erneut auf. Vorübergehende Netzwerk- oder Dienstfehler können eine kurze, begrenzte Folge von Wiederholungsversuchen rechtfertigen. Exponentielles Backoff verlängert die Pause, zum Beispiel 1 Sekunde, 2 Sekunden, dann 4 Sekunden. Beachte einen Retry-After-Antwortheader; er kann eine Verzögerung in Sekunden oder ein HTTP-Datum angeben. Vermeide es, eine Erstellanfrage automatisch zu wiederholen, die möglicherweise bereits erfolgreich war.

Schlägt eine Aktualisierung fehl, sind frühere Daten aber weiterhin nützlich, lass sie mit einem Hinweis wie „Ergebnisse von 10:42 Uhr werden angezeigt. Aktualisierung fehlgeschlagen.“ sichtbar. Lass alte Ergebnisse nicht stillschweigend aktuell erscheinen.

Die schwierigen Abläufe testen

Verwende die Entwicklerwerkzeuge, um die Verbindung zu verlangsamen, offline zu gehen und einen fehlenden Pfad anzufordern. Prüfe, ob der Ladezustand sofort erscheint, eine fehlgeschlagene Anfrage ihn ersetzt, ein Erfolg ohne Ergebnis eine eigene Meldung hat und die Bedienelemente wieder benutzbar werden.

Wichtige Erkenntnisse

  • Mache Laden, Erfolg ohne Ergebnis, Erfolg mit Daten und Fehler sichtbar.
  • Setze gemeinsames Aufräumen in finally.
  • Gib Lesern eine hilfreiche Handlungsmöglichkeit und belasse technische Details in der Konsole.
  • Kündige Statusaktualisierungen über eine geeignete Live-Region an.
  • Begrenze Wiederholungsversuche und beachte die vom Server verlangte Wartezeit.

2.4 Steuere überlappende und parallele Anfragen

Anfragen können länger laufen als die Aktion, die sie gestartet hat. Eine Suchantwort kann eintreffen, nachdem der Leser etwas anderes eingegeben hat, und ein langsamer Dienst kann eine Seite zu lange warten lassen. Steuere sowohl, welche Ergebnisse noch relevant sind, als auch, ob die einzelnen Anfragen erfolgreich waren.

Nicht mehr benötigte Arbeit abbrechen

Erstelle einen AbortController, übergib sein signal an fetch und rufe dann abort() auf, um die Anfrage abzubrechen. Der Abbruch kann sowohl das Warten auf Header als auch einen laufenden Lesevorgang des Antwortkörpers unterbrechen. Der Fehler bei der Ablehnung heißt normalerweise "AbortError".

const controller = new AbortController();
const response = await fetch(url, { signal: controller.signal });
// A cancel button can call controller.abort().
const data = await response.json();

Behandle Fehler bei beiden Aufrufen mit await. Wenn dein Code eine veraltete Suche absichtlich abbricht, kehre bei diesem erwarteten Abbruch ohne Meldung zurück, statt dem Nutzer mitzuteilen, dass der Dienst ausgefallen ist.

fetch hat keine eingebaute Option timeout. Verwende ein Signal wie AbortSignal.timeout(5000), um die Anfrage auf 5000 ms oder 5 Sekunden aktive Zeit zu begrenzen. Vor dem Eintreffen der Header führt der Timeout zur Ablehnung mit TimeoutError; danach kann er das Lesen des Antwortkörpers unterbrechen.

Verhindern, dass alte Suchen gewinnen

Eine Wettlaufsituation entsteht, wenn die Reihenfolge der Abschlüsse das Ergebnis verändert. Ein Leser tippt „ca“ und dann „cat“. Wenn „ca“ zuletzt zurückkommt und gerendert wird, passt die Anzeige nicht mehr zur Eingabe.

Ein Ansatz bricht vor jeder neuen Anfrage die vorherige ab. Ein anderer gibt jedem Aufruf eine Nummer und lässt nur den neuesten Aufruf die Seite aktualisieren:

let latest = 0;
async function search(query) {
  const request = ++latest;
  try {
    const data = await getJSON(searchUrl(query));
    if (request !== latest) return;
    renderResults(data.results);
  } catch (error) {
    if (request !== latest) return;
    showError(error);
  }
}

Die Prüfung verhindert auch, dass ein alter Fehler einen neueren Erfolg ersetzt. Wende bei überlappenden Aufrufen dieselbe Relevanzprüfung auf Lademeldungen und das Zurücksetzen von Bedienelementen an.

Debouncing verringert die Anzahl der gestarteten Aufrufe. Lösche bei jedem Tastendruck den vorherigen Timer und starte einen neuen, zum Beispiel für 300 ms. Wird „paris“ schnell eingegeben, startet nach der Pause eine Anfrage. Debouncing spart Anfragen; es verhindert allein nicht, dass eine frühere, noch laufende Antwort verspätet eintrifft.

Entscheiden, was gleichzeitig laufen kann

Unabhängige Anfragen können gemeinsam starten:

const [user, posts] = await Promise.all([
  getJSON(userUrl),
  getJSON(postsUrl),
]);

Bei einer Dauer von 300 ms und 500 ms benötigen beide zusammen etwa 500 ms statt etwa 800 ms bei sequenzieller Ausführung. Promise.all wird abgelehnt, sobald eine Eingabe abgelehnt wird, bricht aber die anderen Operationen nicht ab.

Verwende Promise.allSettled, wenn Teilergebnisse nützlich sind. Es wartet auf jede Eingabe und meldet sie als { status: "fulfilled", value } oder { status: "rejected", reason }. Eine Übersicht kann dann erfolgreiche Bereiche neben einem fehlgeschlagenen anzeigen.

Abhängige Anfragen müssen nacheinander laufen. Wenn eine zweite URL eine ID aus der ersten Anfrage benötigt, warte auf diese ID, bevor du die zweite Anfrage erstellst.

Wichtige Erkenntnisse

  • Übergib ein Abbruchsignal, bevor du abort() aufrufst.
  • Fange Fehler sowohl beim Abrufen als auch beim Lesen des Antwortkörpers ab.
  • Ignoriere veraltete Ergebnisse und veraltete Fehler.
  • Debouncing reduziert Aufrufe; eine Relevanzprüfung verhindert veraltete Aktualisierungen.
  • Verwende Promise.all für unabhängige Arbeiten, die gemeinsam erfolgreich sein müssen.
  • Verwende Promise.allSettled, wenn Teilergebnisse nützlich sind.
  • Warte auf benötigte Daten, bevor du eine abhängige Anfrage startest.
3

Lies Daten anderer Ursprünge und schütze Anmeldeinformationen

Eine Anfrage kann korrekt aussehen und im Browser trotzdem fehlschlagen, weil Seite und API zu unterschiedlichen Ursprüngen gehören. Diese Grenze wird gemeinsam durch Browserregeln und die Antwortheader des Servers gesteuert. Du bestimmst den Ursprung, deutest Fehler bei Preflight-Anfragen und CORS und unterscheidest die Berechtigung zum Lesen einer Antwort von der Berechtigung zum Ausführen einer Aktion. Bei Anmeldeinformationen ist eine eigene Entscheidung nötig: Alles, was an einen Browser geliefert wird, kann dessen Nutzer untersuchen.

3.1 Verstehe die Ursprungsgrenze des Browsers

Ein Ursprung kombiniert Schema, Host und Port einer URL. Ein Pfad gehört nicht dazu. https://shop.example.com/cart und /help auf derselben Website haben denselben Ursprung. Ein Wechsel zu http://shop.example.com, https://api.example.com oder https://shop.example.com:8443 ändert den Ursprung. HTTPS verwendet normalerweise Port 443.

Wer erlaubt das Lesen der Antwort?

Die Same-Origin-Policy begrenzt, welche Ressourcen ein Seitenskript lesen darf. Für einen Abruf von einem anderen Ursprung ermöglicht CORS dem API-Server, den Zugriff über Antwortheader zu gewähren. Eine Seite unter https://notes.example.org, die https://api.example.com/weather aufruft, benötigt die Erlaubnis der API, um die Antwort zu lesen.

Access-Control-Allow-Origin: https://notes.example.org gewährt diesem Ursprung Zugriff. Der Wert * erlaubt bei einer Anfrage ohne Anmeldeinformationen jeden Ursprung. Hat die Antwort keine passende Erlaubnis, verbirgt der Browser sie vor der Seite und fetch wird mit einem TypeError abgelehnt. Die Konsole liefert die CORS-Diagnose; JavaScript erhält den genauen Grund nicht.

Access-Control-Allow-Origin zur JavaScript-Anfrage hinzuzufügen, gewährt keine Erlaubnis. Es ist ein vom Server gesteuerter Antwortheader. Ein zusätzlicher benutzerdefinierter Anfrageheader kann stattdessen eine zusätzliche Preflight-Prüfung auslösen.

Warum OPTIONS vor POST erscheint

Manche Anfragen an andere Ursprünge benötigen eine Preflight-Anfrage. Der Browser sendet zuerst OPTIONS und führt die beabsichtigte Methode in Access-Control-Request-Method sowie nicht allgemein zugelassene Headernamen in Access-Control-Request-Headers auf. Der Server erlaubt sie mit Access-Control-Allow-Methods und Access-Control-Allow-Headers zusammen mit der Ursprungserlaubnis.

Ein einfaches GET, HEAD oder POST mit ausschließlich erlaubten Headern kann ohne Preflight auskommen. Zu den erlaubten Inhaltstypen gehören text/plain, application/x-www-form-urlencoded und multipart/form-data. Ein JSON-POST, ein Authorization-Header, PUT oder DELETE benötigt eine Preflight-Anfrage, sofern keine gültige frühere Erlaubnis zwischengespeichert ist. Wird die Preflight-Anfrage abgelehnt, wird die eigentliche Anfrage nicht gesendet.

Bei einer einfachen Anfrage kann die eigentliche Anfrage den Server erreichen, auch wenn der Browser später das Lesen ihrer Antwort blockiert. CORS ersetzt daher weder die Autorisierung noch die Eingabeprüfung auf dem Server.

Cookies bringen eine weitere Anforderung mit sich

Die Standardeinstellung credentials: "same-origin" sendet Cookies nur bei Anfragen an denselben Ursprung. credentials: "include" erlaubt geeignete Cookies auch bei Anfragen an andere Ursprünge. Die SameSite-Regeln für Cookies und Richtlinien für Drittanbieter-Cookies gelten weiterhin.

Damit JavaScript eine Antwort auf eine Anfrage mit Anmeldeinformationen lesen kann, muss der Server Access-Control-Allow-Credentials: true senden und den Ursprung der Seite ausdrücklich nennen. Access-Control-Allow-Origin: * funktioniert nicht mit Anmeldeinformationen. Diese Header zwingen einen Browser nicht dazu, ein anderweitig blockiertes Cookie zu senden.

Diagnostizieren, ohne das Problem zu verbergen

mode: "no-cors" ergibt eine opake Antwort mit Status 0 und ohne lesbaren Antwortkörper oder lesbare Header. Sie kann einer Seite kein JSON bereitstellen. Auch eine Anfrage, die in curl funktioniert, belegt keine CORS-Erlaubnis im Browser: Terminal-Clients setzen diese Browserregel nicht durch.

Untersuche die Konsole und den Netzwerk-Tab. Prüfe, ob die Preflight-Anfrage fehlgeschlagen ist oder der abschließenden Antwort die Erlaubnis fehlte. Korrigiere die Antwortkonfiguration der API oder leite den Aufruf über deinen eigenen Server. Stelle Seiten während der Entwicklung über einen lokalen Server bereit: Seiten mit file:// haben häufig opake Ursprünge. Auch ein lokaler Server benötigt CORS-Erlaubnis, wenn er einen anderen Ursprung aufruft.

Wichtige Erkenntnisse

  • Ein Ursprung besteht aus Schema, Host und Port.
  • Die Antwortheader des Servers gewähren die Leseberechtigung für andere Ursprünge.
  • Eine Preflight-Anfrage prüft eine vorgesehene Methode und Header vor der eigentlichen Anfrage.
  • CORS kann eine Antwort verbergen, nachdem eine einfache Anfrage bereits verarbeitet wurde.
  • Antworten auf Anfragen mit Anmeldeinformationen benötigen einen ausdrücklich angegebenen Ursprung und einen Header für Anmeldeinformationen.
  • no-cors erzeugt eine opake Antwort und kein lesbares JSON.

3.2 Halte geheime Schlüssel von der Seite fern

Ein API-Schlüssel identifiziert eine aufrufende Anwendung für Nutzungserfassung, Begrenzungen und Abrechnung. Ein Zugriffstoken gewährt Zugriff für einen Nutzer oder eine Sitzung. Wer nutzbare Anmeldeinformationen besitzt, kann möglicherweise mit den damit verbundenen Rechten handeln. Entscheide daher, wohin sie gehören, bevor du sie einer Anfrage hinzufügst.

Header schützen den Ablageort, aber nicht vor dem Nutzer

Anbieter können Authorization: Bearer <token>, X-API-Key: <key> oder einen Abfrageparameter wie api_key verlangen. Folge der API-Dokumentation. Ein Header verhindert, dass die Anmeldeinformation in einer vollständigen URL steht, die in Protokolle und Analysewerkzeuge gelangen kann. Ein Authorization- oder benutzerdefinierter Header bei einem Aufruf an einen anderen Ursprung löst normalerweise eine Preflight-Anfrage aus.

Ein Header ist in den Entwicklerwerkzeugen trotzdem sichtbar. Besucher können das heruntergeladene JavaScript und die von ihm gesendeten Anfragen untersuchen. Code zu minifizieren oder einen Wert hinter einer Variablen zu verbergen, macht ihn nicht geheim.

Den Schlüssel durch eine Wetteranfrage verfolgen

Angenommen, Browsercode ruft https://api.weather.example/v1/current?city=Lima&key=sk_live_4f9a2c auf. Jeder, der den Netzwerk-Tab öffnet, kann den Schlüssel kopieren und das Kontingent des Kontos verbrauchen. Es hilft nicht, diesen Wert in eine Umgebungsvariable zur Build-Zeit zu verschieben, wenn der Build ihn in das an die Seite gelieferte JavaScript einfügt.

Ein auf dem Server verwahrtes Geheimnis verändert den Weg:

  1. Die Seite ruft ihre eigene Website unter /api/weather?city=Lima auf.
  2. Der Server dieser Website fügt das Geheimnis hinzu und kontaktiert den Wetteranbieter.
  3. Der Server gibt die Wetterdaten an die Seite zurück, ohne das Geheimnis in die Antwort aufzunehmen.

Der Server muss weiterhin den Zugriff auf seinen Endpunkt und dessen Nutzung kontrollieren. Dass das Geheimnis für den externen Dienst auf einem Server liegt, macht eine unbegrenzte öffentliche Nutzung nicht harmlos.

Manche Anbieter vergeben Browserschlüssel, die öffentlich sein sollen. Wende die Domainbeschränkungen des Anbieters an, begrenze die erlaubten APIs und setze Nutzungskontingente. Verwende einen Schlüssel nur dann auf diese Weise, wenn sein dokumentierter Zweck es erlaubt; ein geheimer Serverschlüssel wird durch eine Domainbeschränkung nicht zu einem Browserschlüssel.

Auf eine Offenlegung reagieren

Halte Dateien mit Anmeldeinformationen aus der Versionsverwaltung heraus, indem du zum Beispiel .env in .gitignore aufführst. Das verhindert, dass die Datei committet wird; es verhindert nicht, dass ein Frontend-Build einen Wert veröffentlicht, den der Code einbettet. Wurde ein Schlüssel offengelegt, widerrufe ihn und erstelle einen Ersatz. Das Entfernen aus dem neuesten Commit lässt die frühere Historie und alle Kopien bestehen.

Den Austausch schützen und Verschwendung verringern

Verwende HTTPS für API-Aufrufe, damit Daten und Anmeldeinformationen bei der Übertragung verschlüsselt sind. Ein fetch-Aufruf einer HTTPS-Seite an eine HTTP-API wird als gemischter Inhalt blockiert. Die Verschlüsselung hindert die Person am Browser nicht daran, ihre eigene Anfrage zu sehen.

Eine Ratenbegrenzung beschränkt die Nutzung, zum Beispiel auf 60 Anfragen pro Minute. Aufrufe über dieser Grenze können 429 Too Many Requests zurückgeben. Speichere geeignete Ergebnisse zwischen, nutze Debouncing bei Sucheingaben und vermeide doppelte Aufrufe. Liefert der Server Retry-After, halte die angegebene Wartezeit ein, statt wiederholt sofort neue Versuche zu starten.

Validierung auf der Clientseite macht Formulare leichter nutzbar, aber jeder kann einen Endpunkt ohne dein Formular aufrufen. Der Server muss Anfragen selbst validieren und Aktionen selbst autorisieren. Behandle Zeichenketten beim Anzeigen seiner Antwort weiterhin als nicht vertrauenswürdigen Text und füge sie mit textContent ein.

Wichtige Erkenntnisse

  • An den Browser gelieferter Code und dessen Anfragen legen alle darin enthaltenen Anmeldeinformationen offen.
  • Ein geheimer Schlüssel gehört auf den Server, der den Anbieter aufruft.
  • Beschränke öffentliche Browserschlüssel nach Domain, API und Kontingent.
  • Widerrufe einen offengelegten Schlüssel; ihn aus dem aktuellen Code zu löschen, reicht nicht aus.
  • HTTPS verschlüsselt die Übertragung; der Server muss Anfragen weiterhin validieren und autorisieren.
4

Speichere kleine Zustandsmengen im Browser

Eine Einstellung oder ein Entwurf kann ein Neuladen ohne neue Serveranfrage überstehen. Browserspeicher macht das einfach, aber seine Werte sind Zeichenketten und ihre Lebensdauer hängt vom gewählten Speicher ab. Du speicherst kleine Teile eines Zustands und stellst sie wieder her, prüfst alte Daten vor der Verwendung und gibst zwischengespeicherten API-Ergebnissen eine Ablaufzeit. Außerdem entscheidest du, welche Daten anderswohin gehören, denn lokaler Speicher ist weder ein Tresor für Geheimnisse noch der einzige sichere Aufbewahrungsort für wichtige Arbeit.

4.1 Speichere Zeichenketten und stelle ihre Typen wieder her

Web Storage bietet zwei Schlüssel-Wert-Speicher: localStorage und sessionStorage. Sie verwenden dieselben Methoden. Die Hauptentscheidung betrifft daher die Lebensdauer der Daten und die Tabs, die sie teilen sollen.

Die Lebensdauer wählen
SpeicherLebensdauerGemeinsame Nutzung
localStorageBleibt nach dem Schließen von Tab und Browser erhalten, bis die Daten entfernt oder gelöscht werdenWird von Seiten desselben Ursprungs geteilt
sessionStorageBleibt beim Neuladen während der Seitensitzung des Tabs erhaltenGetrennt für jeden Tab und Ursprung

Das Schließen des Tabs beendet dessen Sitzungsspeicher. Eine neu geöffnete Seite mit einem öffnenden Fenster kann mit einer Kopie des Sitzungsspeichers des öffnenden Fensters beginnen, spätere Änderungen bleiben aber getrennt. Verwende Sitzungsspeicher nicht, um Informationen vor Skripten geheim zu halten.

Speicher ist an Ursprünge gebunden. https://app.example.com kann seinen Speicher nicht mit http://app.example.com teilen. Pfade desselben Ursprungs teilen ihn hingegen. Ein Präfix wie "notes-app:settings" hilft daher, die Schlüssel mehrerer Anwendungen auseinanderzuhalten.

Die Speichermethoden verwenden
localStorage.setItem("notes-app:theme", "dark");
const theme = localStorage.getItem("notes-app:theme");
localStorage.removeItem("notes-app:theme");

setItem erstellt oder überschreibt einen Eintrag. getItem gibt seinen Zeichenkettenwert oder null zurück, falls er fehlt. removeItem entfernt einen Eintrag. clear() entfernt alle Einträge aus diesem Speicherbereich des Ursprungs, was andere Funktionen derselben Website betreffen kann. Mit length und key(index) kannst du die Schlüssel untersuchen.

Verwende diese Methoden statt Eigenschaftszuweisungen wie localStorage.theme = "dark". Schlüssel wie "length" oder "key" können beim Zugriff als Eigenschaften mit eingebauten Mitgliedern kollidieren.

Werte gezielt umwandeln

Nach localStorage.setItem("count", 5) ergibt das Lesen "5". Das direkte Addieren von 1 erzeugt "51". Number(localStorage.getItem("count")) + 1 ergibt 6.

Ein gespeicherter boolescher Wert birgt eine ähnliche Falle. setItem("darkMode", false) speichert "false", und eine nicht leere Zeichenkette ist ein Truthy-Wert. Lies mit localStorage.getItem("darkMode") === "true", wenn dies die beiden erwarteten gespeicherten Zeichenketten sind.

Objekte und Arrays benötigen JSON:

localStorage.setItem("settings", JSON.stringify({
  theme: "dark",
  fontSize: 18,
}));
const settings = JSON.parse(localStorage.getItem("settings"))
  ?? { theme: "light", fontSize: 16 };

Ohne Serialisierung wird ein gewöhnliches Objekt zu "[object Object]". JSON.parse(null) ergibt null, sodass der Standardwert einen fehlenden Eintrag abdeckt. Eine fehlerhaft aufgebaute gespeicherte Zeichenkette benötigt weiterhin try/catch, und geparste Daten benötigen vor der Verwendung eine Strukturprüfung.

Die Arbeitslast klein halten

Aufrufe von Web Storage sind synchron: JavaScript wartet im Hauptthread auf jeden einzelnen. Verwende ihn für Einstellungen, einen Entwurf oder eine kurze Liste, nicht für große Sammlungen oder Dateien. IndexedDB bietet asynchronen Speicher für größere strukturierte Datenmengen.

Aktuelle Browser erlauben üblicherweise etwa 5 MiB in jedem Web-Storage-Bereich pro Ursprung. Ein voller Speicher kann dazu führen, dass setItem einen QuotaExceededError auslöst; auch kann der Zugriff aufgrund der Datenschutzeinstellungen des Browsers fehlschlagen. Behandle Fehler so, dass der Rest der Anwendung weiter funktioniert. Die Entwicklerwerkzeuge zeigen die Speicher im Tab „Application“ von Chrome und Edge oder im Tab „Storage“ von Firefox an. Das Löschen von Einträgen hilft dort, erste Besuche zu testen.

Wichtige Erkenntnisse

  • Wähle localStorage für dauerhaft gemeinsame Einstellungen und sessionStorage für den Zustand einer Tab-Sitzung.
  • Speicherbereiche sind nach Ursprung getrennt.
  • getItem gibt eine Zeichenkette oder null zurück.
  • Serialisiere Objekte mit JSON und stelle ihre Typen beim Lesen wieder her.
  • Behandle Speicherfehler und halte synchrone Schreibvorgänge klein.

4.2 Stelle Zustände wieder her und lass zwischengespeicherte Daten ablaufen

Eine Anwendung lädt normalerweise beim Start und speichert bei Änderungen. Lies eine gespeicherte Liste, wenn die Seite geöffnet wird, rendere sie und speichere die aktualisierte Liste nach einer Bearbeitung. Der Browserspeicher ist eine praktische Kopie: Sie kann fehlen, beschädigt, veraltet oder gelöscht sein.

Vor dem Wiederherstellen validieren

Diese Ladefunktion erwartet ein gespeichertes Array aus Zeichenketten:

function loadTodos() {
  try {
    const value = JSON.parse(localStorage.getItem("todos"));
    if (Array.isArray(value) && value.every(item => typeof item === "string")) {
      return value;
    }
  } catch {
    // Continue with an empty list if reading or parsing fails.
  }
  return [];
}

JSON.parse allein beweist nicht, dass der Wert ein Array ist oder dass seine Einträge zur Anwendung passen. Gültiges JSON wie 42 hat trotzdem die falsche Struktur. Ein mit einer Version versehener Wert wie { version: 2, todos: [...] } lässt neueren Code ältere Formate erkennen und sie entweder umwandeln oder einen Standardwert wiederherstellen.

Speichere die im Arbeitsspeicher gehaltene Liste nach jeder Änderung mit localStorage.setItem("todos", JSON.stringify(todos)). Fange auch Schreibfehler ab; eine Seite sollte weiter funktionieren können, selbst wenn sie den Zustand für das nächste Neuladen nicht sichern kann. Ein Formularentwurf, der nur zu einem Besuch gehört, kann sessionStorage verwenden.

Zwischengespeicherten Antworten einen Zeitstempel geben
localStorage.setItem("weather", JSON.stringify({
  savedAt: Date.now(),
  data,
}));

Prüfe bei einem späteren Laden zuerst die Struktur und den Zeitstempel des zwischengespeicherten Objekts. Sein Alter ist Date.now() - savedAt. Verwende es nur, solange dieses Alter kleiner als 10 * 60 * 1000 beziehungsweise 600.000 ms ist. Ein um 10:00:00 Uhr gespeicherter Wert ist um 10:07:30 Uhr 450.000 ms alt und kann verwendet werden. Um 10:12:00 Uhr ist er 720.000 ms alt; rufe daher einen frischen Wert ab. Bei genau 600.000 ms ist er nach dieser Regel abgelaufen.

Der Ablauf wird durch die Anwendungslogik bestimmt: localStorage löscht einen Eintrag nicht, wenn dein Aktualitätsintervall endet. Weise einen fehlenden oder ungültigen Zeitstempel zurück, statt ein unbekanntes Alter als aktuell zu behandeln. Du kannst veraltete Daten bei einer fehlgeschlagenen Aktualisierung sichtbar lassen, wenn sie als alt gekennzeichnet sind.

Andere Tabs synchronisieren

Wenn ein Tab localStorage ändert, erhalten andere Tabs desselben Ursprungs ein storage-Ereignis. Der schreibende Tab erhält sein eigenes Ereignis nicht. Das Ereignis stellt key, oldValue, newValue und url bereit.

window.addEventListener("storage", (event) => {
  if (event.key === "theme") applyTheme(event.newValue);
});

Wende das Design auch im schreibenden Tab sofort an. Behandle null, wenn ein Schlüssel entfernt wird. Ein storage-Ereignis ersetzt nicht die Aktualisierung des Zustands deiner eigenen Seite.

Entscheiden, was anderswohin gehört

Speichere keine Passwörter, Zahlungskartennummern oder geheimen API-Schlüssel in Web Storage. Skripte des Ursprungs können ihn lesen, einschließlich Codes von Drittanbietern und eingeschleuster Skripte. Lösche relevante personenbezogene Daten beim Abmelden auf gemeinsam genutzten Geräten. Bewahre wichtige Arbeit auf einem Server auf oder biete einen Export an, denn Nutzer können Websitedaten löschen und private Sitzungen verwerfen sie.

Cookies unterscheiden sich: Passende Anfragen senden sie an den Server, und HttpOnly-Cookies können von Seitenskripten nicht gelesen werden. Sie sind klein, jeweils etwa 4 KB. Web Storage bleibt im Browser und ist für Skripte lesbar. IndexedDB eignet sich über eine asynchrone API für größere strukturierte Datenmengen.

Wichtige Erkenntnisse

  • Validiere geparste Daten und greife auf einen Standardwert zurück, wenn sie fehlen oder beschädigt sind.
  • Die Aktualität eines Cache-Eintrags ergibt sich aus einem Zeitstempel und einer von der Anwendung festgelegten Altersgrenze.
  • Das storage-Ereignis erreicht andere Tabs desselben Ursprungs, nicht den schreibenden Tab.
  • Halte Geheimnisse und unersetzliche Daten aus Web Storage heraus.
5

Nutze Standort- und Zwischenablagefunktionen

Browser-APIs verbinden eine Seite mit Funktionen wie Standortermittlung und Zwischenablage. Ihre Verfügbarkeit hängt vom Browser, dem Sicherheitskontext der Seite und den Entscheidungen des Nutzers ab. Du erkennst eine Funktion vor ihrem Aufruf, fragst zu einem geeigneten Zeitpunkt nach Berechtigung und behandelst Erfolg oder Verweigerung. Zu einer vollständigen Interaktion gehören eine sichtbare Rückmeldung und ein anderer Weg, die Aufgabe abzuschließen, etwa die Eingabe einer Stadt oder das Kopieren markierten Textes mit der Tastatur.

5.1 Fordere einen Standort mit Rückfalllösung an

Die Geolocation-API ist eine Browser-API: eine vom Browser bereitgestellte Funktion, die von der JavaScript-Sprache getrennt ist. Wie andere Gerätefunktionen kann sie nicht verfügbar sein oder verweigert werden. Eine Wetterseite sollte weiterhin funktionieren, wenn ein Leser lieber eine Stadt eingibt.

Funktion und Kontext prüfen

Erkenne die Funktion selbst mit "geolocation" in navigator. Den Namen eines Browsers zu prüfen, ist weniger zuverlässig: Versionen und Einstellungen ändern, was verfügbar ist. Die Geolocation-API benötigt einen sicheren Kontext, normalerweise HTTPS; http://localhost erfüllt diese Voraussetzung ebenfalls für die Entwicklung. window.isSecureContext gibt an, ob die aktuelle Seite die Voraussetzung erfüllt. Einfaches HTTP über die Netzwerkadresse eines anderen Geräts ist nicht dasselbe wie localhost.

Erkläre, warum der Standort nützlich ist, und fordere ihn an, wenn der Leser auf „Meinen Standort verwenden“ klickt. Der Browser verwaltet die Berechtigungsanfrage. Eine Person kann sie erlauben oder blockieren, und eine frühere Verweigerung kann dazu führen, dass ein späterer Aufruf ohne erneute Nachfrage fehlschlägt. Der Nutzer kann diese Entscheidung in den Website-Einstellungen ändern.

Das Callback-Ergebnis lesen

navigator.geolocation.getCurrentPosition(success, error, options) verwendet Callbacks. Bei Erfolg enthält position.coords Breiten- und Längengrad in Dezimalgrad und accuracy in Metern. Die Genauigkeit ist ein geschätzter Unsicherheitsradius und keine zusätzliche Dezimalgenauigkeit. Bei einem Fehler bedeutet Code 1, dass die Berechtigung verweigert wurde, 2, dass die Position nicht verfügbar ist, und 3, dass die Wartezeit abgelaufen ist.

Die Optionen steuern den Versuch:

  • enableHighAccuracy: fordert höhere Genauigkeit an; Standardwert false.
  • timeout: Wartezeitbegrenzung in Millisekunden; Standardwert Infinity.
  • maximumAge: Höchstalter einer noch akzeptablen zwischengespeicherten Position; Standardwert 0.

Verwende einen endlichen Timeout, damit die Seite das Warten beenden kann. watchPosition beobachtet Aktualisierungen über die Zeit und gibt eine ID zurück; übergib diese ID an clearWatch, wenn die Verfolgung enden soll.

Callbacks bei Verwendung von await einhüllen
function getPosition(options) {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(resolve, reject, options);
  });
}

async function useLocation() {
  if (!("geolocation" in navigator)) {
    showCityInput();
    return;
  }
  try {
    const { coords } = await getPosition({ timeout: 10000 });
    const url = new URL("https://api.example.com/weather");
    url.searchParams.set("lat", coords.latitude.toFixed(2));
    url.searchParams.set("lon", coords.longitude.toFixed(2));
    await loadWeather(url);
  } catch {
    showCityInput();
  }
}

Hier zeigt showCityInput das Bedienelement für die manuelle Eingabe an und loadWeather fordert Wetterdaten an und rendert sie. Verbinde useLocation mit der Standortschaltfläche. Der catch-Block deckt Fehler bei der Standortermittlung und der Wetteranfrage ab; in beiden Fällen bleibt die manuelle Eingabe verfügbar.

Nur nützliche Genauigkeit anfordern

Eine Position mit dem Breitengrad 52.3676, dem Längengrad 4.9041 und der Genauigkeit 35 hat einen geschätzten Radius von etwa 35 m. Das Runden auf 52.37 und 4.90 verringert die Genauigkeit, die an den Wetterdienst gesendet wird. Ein Breitengradintervall von 0,01° entspricht etwa 1,1 km; der Abstand zwischen Längengraden variiert mit dem Breitengrad. Diese regionale Genauigkeit eignet sich für eine Vorhersage, ohne die detailliertesten Koordinaten weiterzugeben.

Wo die Permissions-API verfügbar ist, meldet navigator.permissions.query({ name: "geolocation" }) den Wert "granted", "denied" oder "prompt". Erkenne und behandle auch diese API. Ihr Zustand hilft, die Oberfläche anzupassen, ersetzt aber nicht die Fehlerbehandlung für den Standortaufruf.

Wichtige Erkenntnisse

  • Erkenne die Geolocation-API und verwende einen sicheren Kontext.
  • Fordere den Standort nach einer eindeutigen Nutzeraktion mit angegebenem Zweck an.
  • Breiten- und Längengrad verwenden Grad; die Genauigkeit verwendet Meter.
  • Setze einen endlichen Timeout und biete bei einem Fehler die manuelle Eingabe an.
  • Sende den Standort nur mit der Genauigkeit, die die Funktion benötigt.
  • Der Berechtigungszustand garantiert keine nutzbare Position.

5.2 Kopiere Text und lerne eine weitere Browser-API kennen

Die Clipboard-API ermöglicht es einer Seite, Text zu kopieren, ohne den Leser zu bitten, ihn zuerst zu markieren. Wie die Geolocation-API benötigt sie eine Prüfung der Verfügbarkeit, eine passende Nutzeraktion, Fehlerbehandlung und eine Rückfalllösung.

Beim Klick kopieren

navigator.clipboard.writeText(text) gibt ein Promise zurück. Warte darauf, bevor du Erfolg meldest. Ein sicherer Kontext ist erforderlich, und eine verweigerte Operation kann mit NotAllowedError abgelehnt werden. Rufe sie direkt aus einem Klick-Handler auf: Firefox und Safari verlangen eine kürzlich erfolgte Nutzerinteraktion, während die Anforderungen von Chromium auch von der Berechtigung zum Schreiben in die Zwischenablage abhängen können.

copyButton.addEventListener("click", async () => {
  try {
    if (!navigator.clipboard?.writeText) {
      throw new Error("Copy unavailable");
    }
    await navigator.clipboard.writeText(codeField.value);
    copyButton.textContent = "Copied!";
  } catch {
    codeField.focus();
    codeField.select();
    copyButton.textContent = "Copy selected text: Ctrl+C / Cmd+C";
  }
  setTimeout(() => {
    copyButton.textContent = "Copy";
  }, 2000);
});

codeField ist ein Texteingabefeld oder ein mehrzeiliges Textfeld und copyButton ist die Schaltfläche der Seite. Schlägt das Kopieren fehl, bietet das Markieren des Textes einen Weg über die Tastatur: Strg+C auf vielen Systemen oder Cmd+C unter macOS. Nach 2000 ms wechselt die Beschriftung zurück zu „Copy“. Zeige „Copied!“ nie an, bevor das Promise erfüllt ist.

Zum Lesen dient navigator.clipboard.readText(); dafür gelten strengere Regeln, weil eine Zwischenablage private Inhalte aus anderen Anwendungen enthalten kann. Ein Browser kann eine Berechtigung verlangen oder eine Einfügeaufforderung anzeigen. Die Berechtigung zum Schreiben bedeutet keine Berechtigung zum Lesen.

Den Verbindungsstatus als Hinweis behandeln

navigator.onLine und die Ereignisse online und offline des Fensters helfen dabei, einen Verbindungshinweis anzuzeigen. Sie belegen nicht, ob deine API erreichbar ist. Ein Gerät kann eine Netzwerkverbindung haben, während der API-Server ausgefallen oder nicht erreichbar ist.

window.addEventListener("offline", () => {
  status.textContent = "You are offline.";
});

Behandle Fehler bei fetch weiterhin, auch wenn navigator.onLine wahr ist. Verwende für die Statusmeldung eine geeignete Live-Region.

Eine teilbare Suche lesen

Die URL-API liest nicht nur API-URLs ein, sondern auch die Abfragezeichenkette der Seite. Auf https://books.example.org/search?q=dune gibt new URL(location.href).searchParams.get("q") den Wert "dune" zurück. Lies diesen Wert beim Laden, um eine Suche aus einem geteilten Link wiederherzustellen. Ein fehlender Parameter ergibt null; entscheide daher, was der Startbildschirm in diesem Fall anzeigen soll.

Eine Lernmethode verwenden

Lies für eine weitere Browser-API ihre Syntax, Regeln für sicheren Kontext und Berechtigungen, Kompatibilitätstabelle und den Baseline-Status auf MDN. Erkenne dann die Funktion, rufe sie bei Bedarf aus einer Nutzeraktion auf, behandle ihr Promise oder ihre Callbacks und biete eine Alternative, wenn sie fehlt oder verweigert wird.

Die Notifications-API zeigt nach einer Berechtigung Systembenachrichtigungen an; Web Share öffnet, wo unterstützt, ein Teilen-Menü des Geräts; Canvas zeichnet Grafiken; Medien-APIs steuern Audio und Video. Eine Karten-API von Drittanbietern kann eine Bibliothek und einen Anbieterschlüssel einbinden. Für ihre Anmeldeinformationen gelten dieselben Regeln für geheime Schlüssel wie für jeden anderen Dienst. Ein Test in einem Browser über localhost belegt nicht, dass ein anderes Gerät oder ein anderer Browser dieselbe Unterstützung und denselben Kontext hat.

Wichtige Erkenntnisse

  • Warte auf writeText, bevor du erfolgreiches Kopieren meldest.
  • Halte eine Rückfalllösung zum Kopieren per Tastatur bereit, wenn der Zugriff auf die Zwischenablage fehlschlägt.
  • Für das Lesen der Zwischenablage gelten eigene, strengere Berechtigungsregeln.
  • Der Online-Status belegt nicht die Erreichbarkeit einer API.
  • Verwende URL-Parameter, um eine teilbare Suche wiederherzustellen.
  • Prüfe für jede Browser-API die Kompatibilität, erkenne ihre Funktionen und behandle Verweigerungen.

Daten abrufen und Browser-APIs: Beispiele

5 Interaktive Lektionen

1

Erstelle und aktualisiere eine Leseliste

14 Schritte
Verfolge eine Anfrage von ihrer URL bis zu ihrer JSON-Antwort, übermittle dann einen neuen Datensatz und behandle das Ergebnis des Servers.
  1. 1
    EinführungVerfolge einen Austausch

    Eine Seite mit einer Leseliste soll Bücher laden und eine Notiz zu einem davon hinzufügen. Die Seite ist der Client; die API ist der Server. Jeder Austausch besteht aus einer Anfrage, die die Aktion beschreibt, und einer Antwort, die ihr Ergebnis beschreibt.

    Wir lesen zuerst den Austausch, verbinden dann die beiden asynchronen Schritte beim Laden von JSON und übermitteln schließlich eine Änderung. Die Antwort des Servers bestimmt, was die Seite als Nächstes sicher anzeigen kann.

  2. 2
    BeispielLies die Ressource und die Filter

    Die Seite fordert GET https://api.example.com/books?author=Le%20Guin&limit=5 an.

    GET fordert das Lesen an. /books bezeichnet die Ressource. Die Abfrage filtert nach Autor und begrenzt die Anzahl der Ergebnisse. %20 steht für das Leerzeichen in „Le Guin“. Die API-Dokumentation legt diese Parameternamen fest; die Seite kann nicht einen anderen Namen wählen und erwarten, dass der Dienst ihn versteht.

  3. 3
    KernaussageUnterscheide Status und Verbindung

    Eine Antwort kann 200 OK mit einem Buch oder 404 Not Found mit einem Fehler melden. Beide belegen, dass ein Server geantwortet hat. Ein Verbindungsfehler liefert der Seite keinen HTTP-Status.

    Untersuche im Netzwerk-Tab die vollständige URL, Methode, Status, Header und Körper. Hat die API das erwartete JSON zurückgegeben, solltest du als Nächstes den Code untersuchen, der es liest oder anzeigt.

  4. 4
    HerausforderungWähle eine Methode für eine Änderung

    Eine Notiz existiert bereits. Die Seite soll nur ihr Feld done ändern und ihren Text erhalten. Welche HTTP-Methode passt zu dieser Operation und warum wäre GET falsch?

    ---reveal---

    Verwende PATCH für die teilweise Aktualisierung. GET ist eine sichere Lesemethode und darf nicht verwendet werden, um eine Datenänderung anzufordern. PUT würde einen vollständigen Ersatz beschreiben und könnte Felder zurücksetzen, die im Anfragekörper fehlen.

  5. 5
    ErklärungWarte auf die Antwort

    Beginne mit const response = await fetch(url). Das wartet, bis die Antwortheader eintreffen, und liefert ein Response-Objekt, nicht die geparsten Bücher.

    Die Antwort kann trotzdem einen HTTP-Fehler melden. fetch wird bei einem 404 erfüllt, weil eine Antwort vorliegt. Prüfe response.ok, bevor du die Operation als erfolgreich behandelst; der Wert ist für Statuscodes von 200 bis 299 wahr.

  6. 6
    BeispielPrüfe und lies den Antwortkörper

    Fahre innerhalb der async-Funktion fort:

    if (!response.ok) {
      throw new Error(`HTTP error ${response.status}`);
    }
    const data = await response.json();
    

    Der zweite Wartevorgang liest und parst den Antwortkörper. Nun ist data ein JavaScript-Wert. Ein äußeres try/catch kann sowohl den hier ausgelösten Statusfehler als auch Fehler beim Abrufen oder Parsen des Körpers behandeln.

  7. 7
    BeispielFinde das verschachtelte Array

    Angenommen, der Antwortkörper lautet {"results":[{"title":"Dune"}],"total":1}.

    Der erste Schritt, data.results, erreicht das Array. [0] erreicht dessen erstes Objekt. .title ergibt "Dune". Eine Renderfunktion sollte data.results erhalten, nicht das gesamte äußere Objekt. Die Antwortvorschau im Netzwerk-Tab ist nützlich, wenn sich die Struktur der API von der Erwartung der Seite unterscheidet.

  8. 8
    HerausforderungDiagnostiziere den fehlenden Wert

    Der Code verwendet const data = response.json() und versucht dann data.results[0]. Der Antwortkörper ist tatsächlich gültiges JSON mit einem results-Array. Was fehlt?

    ---reveal---

    Warte auf den Antwortkörper: const data = await response.json(). Ohne dieses Warten ist data ein Promise und hat keine Eigenschaft results. Das erste await fetch(...) hat nicht auch auf das Parsen von JSON gewartet.

  9. 9
    TippErhalte Satzzeichen in einer Suche

    Erstelle Abfrageparameter über die URL-API:

    const url = new URL("https://api.example.com/search");
    url.searchParams.set("q", "rock & roll");
    

    Der Wert wird zu rock+%26+roll. Das kaufmännische Und bleibt innerhalb des Suchbegriffs, statt die Abfrage zu teilen. Verwende nach dem Laden die geparste Antwort erneut: Eine zweite Methode zum Lesen des Körpers für dieselbe Antwort aufzurufen, schlägt fehl, weil der Körper bereits gelesen wurde.

  10. 10
    BeispielBereite das Übermitteln von JSON vor

    Um eine Notiz zu erstellen, serialisiere die Felder und gib ihr Format an:

    const response = await fetch("https://api.example.com/notes", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ title: "Read", done: false }),
    });
    

    Die Methode fordert die Erstellung an, der Header gibt JSON an und der Anfragekörper enthält JSON-Text statt eines gewöhnlichen Objekts.

  11. 11
    VerbindungNutze den gespeicherten Datensatz

    Der Server kann 201 Created mit {"id":31,"title":"Read","done":false} zurückgeben. Füge diesen zurückgegebenen Datensatz zum Zustand der Seite hinzu. Seine ID ermöglicht es einer späteren Aktion, /notes/31 aufzurufen.

    Übergib bei einem Formular mit Dateien FormData statt JSON und lass den Browser das Multipart-Trennzeichen setzen. Eine Anfrage mit GET kann über fetch keinen Anfragekörper übertragen; Suchfelder gehören in die Abfragezeichenkette.

  12. 12
    HerausforderungBehandle einen Erfolg ohne Antwortkörper

    Das Löschen einer gespeicherten Notiz gibt 204 zurück. Der Code prüft response.ok, ruft dann response.json() auf und zeigt einen Fehler an. Ist das Löschen zwangsläufig fehlgeschlagen und was sollte sich ändern?

    ---reveal---

    Nein: 204 meldet einen erfolgreichen Abschluss ohne Antwortkörper. Überspringe bei diesem Status das Parsen von JSON und aktualisiere die Seite nach der Statusprüfung. Der Parserfehler entstand durch den Versuch, leeren Inhalt zu lesen; er ist kein Beleg dafür, dass das Löschen fehlgeschlagen ist.

  13. 13
    HerausforderungPrüfe einen vollständigen Ablauf zum Absenden

    Eine Speichern-Schaltfläche kann zweimal angeklickt werden, während ein POST läuft. Eine erfolgreiche Antwort liefert eine neue ID. Nenne die beiden Verhaltensweisen der Seite, die ein versehentliches Duplikat verhindern und diese ID erhalten.

    ---reveal---

    Deaktiviere die Schaltfläche während der Anfrage und aktiviere sie in finally wieder. Aktualisiere bei Erfolg anhand des zurückgegebenen Datensatzes einschließlich seiner ID. Die Schaltfläche verhindert wiederholte Klicks; das Serverergebnis liefert Werte, die in den übermittelten Daten nicht vorhanden waren.

  14. 14
    ZusammenfassungPrüfe den Austausch an jeder Schnittstelle

    Wenn eine Anfrage nicht wie erwartet funktioniert, untersuche die Operation der Reihe nach: die dokumentierte URL und Methode, den tatsächlichen Status, die gewählte Methode zum Lesen des Körpers und die Struktur der Daten, die an die Seite übergeben werden.

    Prüfe bei einem Schreibvorgang auch den Inhaltstyp und den serialisierten Anfragekörper. Ein Erfolg ohne Inhalt benötigt keine Methode zum Lesen von JSON. Die Antwort auf eine Erstellung sollte den gespeicherten Datensatz liefern, der für die nächste Bearbeitung oder Löschung verwendet wird.

2

Erstelle eine Suchseite, die aktuell bleibt

18 Schritte
Rendere eine Liste, formatiere einen Preis und ein Datum und halte den Anfragezustand bei langsamen, fehlgeschlagenen und überlappenden Suchen korrekt.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungHalte die Anzeige mit der Suche abgestimmt
  2. 2
    BeispielErsetze die vorherige Liste
  3. 3
    KernaussageUnterscheide null von fehlenden Daten
  4. 4
    HerausforderungBehandle externen Text und Links
  5. 5
    BeispielLies die Zeiteinheit
  6. 6
    ErklärungWähle die Zeitzone für die Anzeige
  7. 7
    BeispielFormatiere dokumentierte Währungsuntereinheiten
  8. 8
    HerausforderungTrenne Gebietsschema und Wert
  9. 9
    ErklärungBeginne mit einem sichtbaren Wartezustand
  10. 10
    BeispielSchließe alle Wege ab
  11. 11
    HerausforderungErkenne eine erfolgreiche Suche ohne Treffer
  12. 12
    TippWarte vor einem erneuten Versuch bei einem vorübergehenden Fehler
  13. 13
    BeispielBeachte die Reihenfolge der Abschlüsse
  14. 14
    BeispielBrich eine veraltete Anfrage ab
  15. 15
    VerbindungVerringere Aufrufe während der Eingabe
  16. 16
    HerausforderungWähle Teilerfolg
  17. 17
    HerausforderungSchütze die gesamte aktuelle Interaktion
  18. 18
    ZusammenfassungTeste die Oberfläche mit unvollkommenen Antworten
3

Diagnostiziere einen API-Aufruf an einen anderen Ursprung

10 Schritte
Verfolge die Leseberechtigung des Browsers getrennt von der Autorisierung auf dem Server und dem Schutz eines Anbieterschlüssels.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungTrenne zwei Berechtigungsfragen
  2. 2
    BeispielVergleiche die vollständigen Ursprünge
  3. 3
    ErklärungLies die Erlaubnis des Servers
  4. 4
    BeispielVerfolge zuerst die Preflight-Anfrage
  5. 5
    HerausforderungErkläre einen Erfolg nur im Terminal
  6. 6
    BeispielFinde den offengelegten Schlüssel
  7. 7
    VerbindungVerschiebe die Grenze des Geheimnisses
  8. 8
    HerausforderungUnterscheide Übertragung und Geheimhaltung
  9. 9
    HerausforderungPrüfe Cookies und lesbare Antworten
  10. 10
    ZusammenfassungDiagnostiziere die fehlgeschlagene Grenze
4

Stelle eine gespeicherte Liste wieder her, ohne die Seite zu beschädigen

12 Schritte
Wähle die Lebensdauer des Speichers, erhalte Datentypen, validiere wiederhergestellte Daten und wende eine Aktualitätsregel für den Cache an.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungHalte eine praktische lokale Kopie bereit
  2. 2
    ErklärungWähle, was erhalten bleiben soll
  3. 3
    BeispielBewahre ein Array als Text auf
  4. 4
    HerausforderungStelle den beabsichtigten Typ wieder her
  5. 5
    TippBehandle einen Schreibvorgang ohne ausreichenden Platz
  6. 6
    BeispielPrüfe mehr als die JSON-Syntax
  7. 7
    BeispielFüge eine Cache-Zeit hinzu
  8. 8
    HerausforderungBerechne, welcher Cache-Eintrag aktuell ist
  9. 9
    VerbindungVerfolge ein Design über Tabs hinweg
  10. 10
    KernaussageSchütze wichtige Daten
  11. 11
    HerausforderungBehandle ein altes gespeichertes Format
  12. 12
    ZusammenfassungTeste einen ersten und einen erneuten Besuch
5

Ergänze nützliche Standort- und Kopierschaltflächen

13 Schritte
Erstelle Interaktionen, die Berechtigungen berücksichtigen und Feature-Erkennung, klare Rückmeldungen und manuelle Alternativen bieten.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungMache die Aktion verständlich
  2. 2
    ErklärungPrüfe Kontext und Verfügbarkeit
  3. 3
    TippFrage, wenn die Funktion nützlich ist
  4. 4
    BeispielSetze eine endliche Wartezeit
  5. 5
    BeispielLies nur eine nützliche Genauigkeit
  6. 6
    HerausforderungReagiere auf eine Verweigerung
  7. 7
    BeispielSchreibe beim Klick
  8. 8
    KernaussageWarte, bevor du das Kopieren als erfolgreich meldest
  9. 9
    HerausforderungBehandle ein Verbindungssignal als Hinweis
  10. 10
    VerbindungStelle eine Suche aus ihrem Link wieder her
  11. 11
    TippPrüfe eine weitere Browserfunktion
  12. 12
    HerausforderungPrüfe beide Schaltflächen zusammen
  13. 13
    ZusammenfassungTeste auch die Entscheidungen der Person

Daten abrufen und Browser-APIs: Übungsaufgaben

40 Übungsfragen in 4 Sets

Set 1: Anfragen, Ergebnisse und Browserfunktionen10 Übungsfragen

Frage 1 von 10

Eine Antwort hat den Status 403. Was teilt dieser Status der Seite mit?
  1. Der Server konnte die Anfrage überhaupt nicht empfangen.
  2. Der Server benötigt eine Weiterleitung der Ressourcen-URL.
  3. Der Server hat die Anfrage verstanden, aber verweigert.
  4. Der Server hat die Anfrage mit leerem Körper angenommen.
Antwort zeigenAntwort ausblenden
Antwort: C
Eine Antwort mit 403 bedeutet, dass der Server die Anfrage verstanden hat und ihre Ausführung verweigert. Sie belegt weder, dass der Nutzer gültige Anmeldeinformationen angegeben hat, noch, dass eine Anmeldung die Verweigerung behebt. Bei einer fehlgeschlagenen Netzwerkverbindung gäbe es keinen HTTP-Status, den die Seite lesen könnte.

Frage 2 von 10

Eine API gibt 200 mit {"items":[{"name":"Cedar"}]} zurück. Welche Zuweisung speichert nach const response = await fetch(url) den Namen des ersten Eintrags?
  1. const name = (await response.json()).items[0].name;
  2. const name = response.json().items[0].name;
  3. const name = (await response.json())[0].items.name;
  4. const name = (await response.text()).items[0].name;
Antwort zeigenAntwort ausblenden
Antwort: A
Warte darauf, dass json() den Antwortkörper liest und parst, und folge dann der äußeren Eigenschaft items zum ersten Objekt des Arrays. Ein Aufruf von json() ohne await hinterlässt ein Promise, das kein Array items hat. Das Lesen mit text() ergibt stattdessen eine Zeichenkette und nicht das für den Eigenschaftszugriff benötigte geparste Objekt.

Frage 3 von 10

Ein Endpunkt akzeptiert einen JSON-Anfragekörper. Welchen Wert sollte body beim Senden von { label: "Read" } erhalten?
  1. JSON.parse({ label: "Read" })
  2. String({ label: "Read" })
  3. { label: "Read" }.toString()
  4. JSON.stringify({ label: "Read" })
Antwort zeigenAntwort ausblenden
Antwort: D
JSON.stringify wandelt das Objekt in gültigen JSON-Text für den Anfragekörper um. Die Umwandlung eines gewöhnlichen Objekts mit String oder toString() erzeugt "[object Object]", was der JSON-Endpunkt nicht parsen kann. Die Anfrage benötigt außerdem die dokumentierte Methode und einen Header für den JSON-Inhaltstyp.

Frage 4 von 10

Eine API gibt { remaining: 0, owner: null } zurück. Wie kann die Seite die verbleibende Anzahl anzeigen und zugleich "Unknown" für den fehlenden Namen des Besitzers verwenden?
  1. data.remaining || "n/a"; data.owner?.name ?? "Unknown";
  2. data.remaining ?? "n/a"; data.owner?.name ?? "Unknown";
  3. data.remaining ?? "n/a"; data.owner.name ?? "Unknown";
  4. data.remaining || "n/a"; data.owner.name || "Unknown";
Antwort zeigenAntwort ausblenden
Antwort: B
Der Nullish-Coalescing-Operator erhält die gültige Anzahl null, und die optionale Verkettung vermeidet es, name aus null zu lesen. Wird || für die Anzahl verwendet, ersetzt es null, weil null ein Falsy-Wert ist. Eine Rückfalllösung nach data.owner.name kann nicht helfen, wenn der Zugriff auf name bereits einen Fehler ausgelöst hat.

Frage 5 von 10

Eine API dokumentiert amount: 3785, currency: "USD" als ganzzahlige Währungsuntereinheiten. Welche Zahl sollte an den Währungsformatierer übergeben werden?
  1. 3785
  2. 37.85
  3. 378.5
  4. 0.3785
Antwort zeigenAntwort ausblenden
Antwort: B
USD hat 100 Währungsuntereinheiten pro Haupteinheit, daher entspricht die dokumentierte Ganzzahl 37,85 US-Dollar. Würde 3785 direkt übergeben, wäre der angezeigte Betrag 100-mal zu groß. Intl.NumberFormat formatiert die übergebene Zahl; der Formatierer erkennt nicht selbst, dass ein API-Betrag in Cent angegeben ist.

Frage 6 von 10

Eine Suche deaktiviert ihre Schaltfläche und wartet dann auf eine Anfrage. Die Schaltfläche wird erst nach dem Rendern erfolgreicher Ergebnisse wieder aktiviert. Bei einer fehlgeschlagenen Anfrage bleibt sie deaktiviert. Wohin gehört die gemeinsame Anweisung zum erneuten Aktivieren?
  1. In den Erfolgszweig nach dem Entfernen des Status.
  2. In einen Timer, der vor der Antwortprüfung startet.
  3. In einen catch-Block statt des Aufräumens bei Erfolg.
  4. In einen finally-Block um die erwartete Arbeit.
Antwort zeigenAntwort ausblenden
Antwort: D
finally wird nach der geschützten Arbeit ausgeführt, unabhängig davon, ob sie erfolgreich ist oder einen Fehler auslöst. Dort gehört daher das Aufräumen hin, das auf beiden Wegen nötig ist. Ein Zurücksetzen nur in catch erfasst den Erfolg nicht; nach dem Rendern erfasst es den Fehler nicht. Ein Timer würde Bedienelemente zurücksetzen, ohne zu wissen, ob die Anfrage abgeschlossen ist.

Frage 7 von 10

Eine Seite liegt unter https://studio.example.org/edit. Was ist der Ursprung dieser Seite?
  1. https://studio.example.org
  2. https://studio.example.org/edit
  3. https://example.org
  4. http://studio.example.org
Antwort zeigenAntwort ausblenden
Antwort: A
Der Ursprung besteht aus Schema, Host und Port; HTTPS verwendet seinen Standardport, wenn keiner angegeben ist. Der Pfad /edit bezeichnet eine Ressource innerhalb des Ursprungs und ist nicht Teil des Ursprungs selbst. Ein Wechsel des Schemas zu HTTP würde selbst bei gleichem Host einen anderen Ursprung ergeben.

Frage 8 von 10

Ein Frontend-Build liest einen geheimen Anbieterschlüssel aus einer ignorierten Umgebungsdatei und sendet ihn in einem HTTPS-Anfrageheader. Ein Besucher kopiert den Schlüssel aus dem Netzwerk-Tab. Welche Änderung schützt einen Ersatzschlüssel vor Browserbesuchern?
  1. Die ignorierte Datei entfernen und denselben heruntergeladenen Build behalten.
  2. Mit kürzerem Variablennamen neu bauen und denselben Header behalten.
  3. Den offengelegten Schlüssel widerrufen und den Server den Ersatz hinzufügen lassen.
  4. Einen Ersatzschlüssel in den Anfragekörper setzen und den Header entfernen.
Antwort zeigenAntwort ausblenden
Antwort: C
Widerrufe den kopierten Schlüssel und bewahre den Ersatz dann auf einem Server auf, der den Anbieter aufruft. Eine ignorierte Umgebungsdatei schützt die Versionsverwaltung, während ein Frontend-Build ihre Werte trotzdem veröffentlichen kann. HTTPS schützt die Übertragung; den Schlüssel zwischen Feldern der Browseranfrage zu verschieben, verbirgt ihn nicht vor dem Nutzer des Browsers.

Frage 9 von 10

Welchen Wert hat nach localStorage.setItem("visits", 8) der Ausdruck localStorage.getItem("visits") + 1?
  1. "81"
  2. 9
  3. "9"
  4. 81
Antwort zeigenAntwort ausblenden
Antwort: A
Web Storage gibt die Zeichenkette "8" zurück, sodass + 1 eine Konkatenation ausführt und "81" ergibt. Der numerische Typ, der an setItem übergeben wurde, wird nicht wiederhergestellt. Wandle die gespeicherte Zeichenkette vor dem Addieren mit Number um, wenn die Zahl 9 das beabsichtigte Ergebnis ist.

Frage 10 von 10

Eine Standortanfrage schlägt mit dem Geolocation-Fehlercode 1 fehl. Welche Antwort an den Nutzer passt zu diesem Fehler?
  1. Erklären, dass die Standortanfrage abgelaufen ist, und sofort wiederholen.
  2. Erklären, dass keine Position existiert, und das Wetterformular ausblenden.
  3. Den verweigerten Standortzugriff erklären und eine Stadteingabe anbieten.
  4. Erklären, dass keine Position verfügbar war, und einen weiteren Versuch anbieten.
Antwort zeigenAntwort ausblenden
Antwort: C
Der Geolocation-Fehlercode 1 bedeutet, dass die Berechtigung verweigert wurde. Biete daher eine andere Möglichkeit zur Eingabe des Standorts an. Eine abgelaufene Wartezeit hat den Code 3 und erklärt diesen Fehler nicht. Wiederholte Anfragen können keine Berechtigung erzwingen; bei einer gespeicherten Verweigerung muss der Nutzer möglicherweise die Website-Einstellungen des Browsers ändern.
Set 2: Verfolge Daten durch die Oberfläche10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein fetch-Aufruf gibt ein Response-Objekt mit dem Status 502 zurück. Der Code hat einen catch-Handler, prüft aber nie response.ok. Warum erscheint seine HTTP-Fehlermeldung möglicherweise nie?
  1. Ein HTTP-Fehler lehnt erst ab, nachdem der catch-Handler zurückkehrt.
  2. Ein HTTP-Fehler erfüllt fetch; der Code muss seinen Status prüfen.
  3. Eine Antwort mit 502 bleibt verborgen, bis ihr JSON-Körper gelesen wurde.
  4. Ein catch-Handler erhält Serverstatus nur mit no-cors.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein dokumentierter Endpunkt zum Löschen gibt bei Erfolg 204 zurück. Was sollte die Seite tun, bevor sie versucht, JSON zu parsen?
  1. 204 als Fehler erkennen und dieselbe Löschung wiederholen.
  2. 204 als Erfolg erkennen und ein leeres Objekt parsen.
  3. 204 als Weiterleitung erkennen und dieselbe URL abrufen.
  4. 204 als Erfolg erkennen und den Körper nicht lesen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine neue Suche hängt ihre Einträge an die alten Ergebnisse an. Eine separate Schaltfläche „Mehr laden“ soll weiterhin Seiten anhängen. Wie sollte sich das Renderverhalten unterscheiden?
  1. Bei neuer Suche leeren; bei weiterer Seite anhängen.
  2. Bei neuer Suche anhängen; bei weiterer Seite leeren.
  3. Bei beiden Aktionen vor dem Hinzufügen der Ergebnisse leeren.
  4. Bei beiden Aktionen anhängen und nur leere Einträge entfernen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Zwei unabhängige Lesevorgänge dauern etwa 240 ms und 680 ms. Wie lange sollte das Warten auf beide mit Promise.all ohne zusätzlichen Aufwand dauern?
  1. Etwa 920 ms.
  2. Etwa 240 ms.
  3. Etwa 680 ms.
  4. Etwa 440 ms.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Suche nach „lo“ startet, danach eine Suche nach „lotus“. Der Abschluss einer älteren Suche kann die neue Lademeldung ausblenden, und ein älterer Fehler kann neuere Ergebnisse ersetzen. Im Anfrage-Wrapper ist kein Abbruch verfügbar. Welche Aktualisierungsregel hält die gesamte Anzeige an die aktuelle Suche gebunden?
  1. Nur erfolgreiche Aufrufe vergleichen vor dem Rendern ihre Nummer.
  2. Nur fehlgeschlagene Aufrufe vergleichen vor Fehlermeldungen ihre Nummer.
  3. Nur der neueste Aufruf darf Ergebnisse, Fehler oder Ladezustand ändern.
  4. Jeder Aufruf leert die Liste, sobald seine eigene Anfrage endet.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Seite sendet von einem anderen Ursprung aus ein JSON-POST mit Content-Type: application/json. Es ist keine Preflight-Erlaubnis zwischengespeichert. Was muss der Browser prüfen, bevor er dieses POST sendet?
  1. Eine GET-Antwort mit demselben JSON wie beim geplanten POST.
  2. Eine OPTIONS-Antwort, die Ursprung, Methode und Header erlaubt.
  3. Eine OPTIONS-Anfrage mit dem Allow-Origin-Antwortheader.
  4. Eine POST-Antwort, die deaktivierte Same-Origin-Regeln der Seite meldet.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein mehrstufiges Formular soll das Neuladen in seinem Tab überstehen, aber mit der Sitzung dieses Tabs enden. Welche Speicherwahl passt?
  1. localStorage verwenden und den Eintrag lassen, bis Code ihn entfernt.
  2. Den Fortschritt nur in einer JavaScript-Variablen im Speicher halten.
  3. localStorage verwenden und den Eintrag bei jedem Laden der Seite löschen.
  4. sessionStorage verwenden, um den aktuellen Fortschritt des Tabs zu erhalten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Cache-Eintrag läuft nach 6 Minuten ab. Er wurde um 09:12:00 Uhr gespeichert und um 09:19:30 Uhr gelesen. Wie sollte die Anwendung ihn behandeln?
  1. Er ist 450.000 ms alt und benötigt frische Daten.
  2. Er ist 75.000 ms alt und kann als aktuell gelten.
  3. Er ist 450.000 ms alt und kann als aktuell gelten.
  4. Er ist 7.500 ms alt und benötigt frische Daten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Wetteranwendung funktioniert unter http://localhost, aber ihre Standortfunktion fehlt, wenn sie auf einem Telefon unter einer HTTP-Netzwerkadresse geöffnet wird. Außerdem funktioniert die Anwendung nicht mehr, wenn Desktopnutzer den Standortzugriff verweigern. Welches Vorgehen behebt beide Probleme?
  1. Standort beim Laden erneut anfordern und nach Verweigerung die Stadteingabe ausblenden.
  2. Über HTTPS bereitstellen, die Geolocation-API erkennen und die Stadteingabe verfügbar halten.
  3. Den Browsernamen prüfen und den Standort ohne Wartezeitbegrenzung anfordern.
  4. HTTP beibehalten, hohe Genauigkeit setzen und Berechtigungsprüfungen entfernen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Kopier-Handler wartet auf navigator.clipboard.writeText(text). Wann sollte er „Copied!“ anzeigen?
  1. Nachdem dieses Promise erfüllt ist.
  2. Sobald writeText zurückkehrt.
  3. Wenn die Feature-Erkennung erfolgreich ist.
  4. Sofort, wenn der Nutzer klickt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Untersuche Fehler bei Anfragen, Speicher und Berechtigungen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Dienst dokumentiert PUT /profiles/29 als Ersetzen des Profils. Was bedeutet Idempotenz, wenn dieselbe vollständige Anfrage zweimal gesendet wird?
  1. Die beiden Antworten müssen genau denselben Status und dieselben Header enthalten.
  2. Die zweite Anfrage muss abgelehnt werden, bevor sie den Dienst erreicht.
  3. Der Server muss für jede identische Anfrage ein neues Profil erstellen.
  4. Das beabsichtigte gespeicherte Profil ist dasselbe wie nach einer Anfrage.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Bei einer Erstellanfrage läuft die Wartezeit ab, nachdem der Server sie möglicherweise erhalten hat. Die Seite versucht es sofort erneut, rendert nur die übermittelten Felder und sendet dann eine Bearbeitung an eine undefinierte ID. Welches Vorgehen sollte diese Abfolge ersetzen?
  1. Wiederholungen verhindern, ungewisse Erstellungen klären und zurückgegebene IDs behalten.
  2. Timeouts wiederholen, übermittelte Felder behalten und IDs aus der Listenfolge ableiten.
  3. Klicks verhindern, jeden Timeout wiederholen und nur übermittelte Felder behalten.
  4. Wiederholungen erlauben, zurückgegebene IDs verwerfen und die Erstell-URL für Bearbeitungen nutzen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Ereignis-API dokumentiert ihren Zeitstempel in Sekunden. Eine Seite übergibt ihn direkt an new Date und zeigt Januar 1970 an. Welche Umwandlung sollte vor der Datumsformatierung erfolgen?
  1. Den Zeitstempel durch 1000 dividieren.
  2. Den UTC-Versatz des Lesers addieren.
  3. Den Zeitstempel mit 1000 multiplizieren.
  4. Das Gebietsschema des Formatierers ersetzen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Katalog behält die Daten von gestern, nachdem eine Aktualisierung 503 mit Retry-After: 12 zurückgegeben hat. Welches Verhalten vermittelt den Zustand und ermöglicht eine erneute Aktualisierung?
  1. Den Fehler verbergen und die alten Daten als gerade aktualisiert kennzeichnen.
  2. Die Daten als alt kennzeichnen und vor einem begrenzten Wiederholungsversuch mindestens 12 Sekunden warten.
  3. Die Liste leeren und sofort wiederholen, bis ein Erfolgsstatus eintrifft.
  4. Die Antwort als leeren Erfolg behandeln und alle künftigen Aktualisierungen deaktivieren.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Kontoansicht benötigt ein Profil und die Bezeichnung seines Teams. Das Profil liefert teamId zurück. Hinweise sind unabhängig und dürfen fehlschlagen, ohne Kontodaten auszublenden. Wie sollte die Arbeit organisiert werden?
  1. Alle Anfragen gemeinsam starten und bei jedem Fehler die ganze Ansicht verwerfen.
  2. Eine Kette von Profil zu Team neben den Hinweisen ausführen und die Ergebnisse getrennt behandeln.
  3. Hinweise, Profil und Team nacheinander mit einem gemeinsamen Fehlerhandler laden.
  4. Hinweise nach dem Profil starten und das Team nur bei erfolgreichen Hinweisen laden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein geheimer Schlüssel eines Anbieters wurde in ein Repository committet. Welche Maßnahme verhindert die weitere Verwendung der offengelegten Anmeldeinformation?
  1. Ihn nur aus dem neuesten Commit entfernen.
  2. Ihn im JavaScript-Quelltext umbenennen.
  3. Ihn in einen öffentlichen Anfrageheader verschieben.
  4. Ihn widerrufen und einen Ersatz erstellen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein gespeicherter boolescher Wert wird mit if (localStorage.getItem("compact")) wiederhergestellt. Der gespeicherte Text lautet "false", trotzdem wird der kompakte Modus eingeschaltet. Warum?
  1. Web Storage stellt boolesche Werte mit ihren ursprünglichen Typen wieder her.
  2. Ein fehlender Speicherschlüssel gibt standardmäßig die Zeichenkette "true" zurück.
  3. Eine nicht leere Zeichenkette ist ein Truthy-Wert, auch wenn ihr Text "false" lautet.
  4. Die Anweisung if wandelt den gespeicherten Text in einen wahren Wert um.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Zwei Tabs desselben Ursprungs teilen den Zustand des kompakten Modus als Zeichenkette „true“ oder „false“. Tab A speichert „false“, wartet aber auf sein eigenes storage-Ereignis; Tab B behandelt das Ereignis mit Boolean(event.newValue). Das Entfernen des Schlüssels soll den kompakten Modus ausschalten. Welche Aktualisierungsregel behandelt alle drei Fälle?
  1. Änderungen im schreibenden Tab und in Listenern anwenden; nur bei „true“ einschalten.
  2. In beiden Tabs auf Ereignisse warten; bei jeder nicht leeren Zeichenkette einschalten.
  3. Änderungen nur im schreibenden Tab anwenden; in anderen Tabs den Modus beibehalten.
  4. Den schreibenden Tab neu laden; Ereigniswerte mit Boolean prüfen und den Modus nach dem Entfernen behalten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Standortergebnis hat den Breitengrad -12.0464, den Längengrad -77.0428 und die Genauigkeit 80. Was beschreibt 80?
  1. Eine geschätzte Position 80 Meter über dem Meeresspiegel.
  2. Eine Wahrscheinlichkeit von 80 %, dass der Standort exakt ist.
  3. Eine Garantie, dass das Gerät innerhalb von 80 Metern liegt.
  4. Einen geschätzten horizontalen Unsicherheitsradius von 80 Metern.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Seite unter https://recipes.example.org/search?q=green+tea liest new URL(location.href).searchParams.get("q"). Welchen Wert erhält sie?
  1. "green+tea"
  2. "q=green+tea"
  3. "green tea"
  4. null
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Entwirf zuverlässige API-Funktionen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine API begrenzt eine Anwendung auf 80 Aufrufe pro Minute. Anfragen über dieser Grenze erhalten 429. Was bedeutet dieser Status?
  1. Der angeforderte Datensatz ist nicht mehr vorhanden.
  2. Es wurden zu viele Anfragen gestellt.
  3. Ein vollständiger Ersatz ist erforderlich.
  4. Der Endpunkt wurde dauerhaft verschoben.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Suche muss den exakten Wert „A+B & C“ senden. Welcher Code setzt diesen Wert, ohne seine Satzzeichen als URL-Struktur zu behandeln?
  1. url.search = "q=" + "A+B & C";
  2. url.hash = "q=" + "A+B & C";
  3. url.searchParams.set("q", "A+B & C");
  4. url.pathname += "?q=" + "A+B & C";
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein API-Datensatz hat einen Titel mit wörtlichem <b>-Text, einen javascript:-Link und remaining: 0. Die Seite muss den Titel wörtlich anzeigen, nur gewöhnliche Weblinks erlauben und die Anzahl erhalten. Welcher Renderplan erfüllt alle drei Anforderungen?
  1. textContent verwenden, HTTP(S)-URLs prüfen und die Anzahl mit ?? vorbelegen.
  2. innerHTML verwenden, HTTP(S)-URLs prüfen und die Anzahl mit ?? vorbelegen.
  3. textContent verwenden, jedes href zuweisen und die Anzahl mit ?? vorbelegen.
  4. textContent verwenden, HTTP(S)-URLs prüfen und die Anzahl mit || vorbelegen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Zwei Leser betrachten denselben UTC-Zeitpunkt mit Intl.DateTimeFormat und dem festen Gebietsschema en-US, aber ohne Option timeZone. Ihre angezeigten Uhrzeiten unterscheiden sich. Was erklärt den Unterschied?
  1. Das Gebietsschema wählt den UTC-Versatz jedes Lesers.
  2. Das Date ändert seinen gespeicherten Zeitpunkt je Gerät.
  3. Das Z-Suffix wird ohne timeZone ignoriert.
  4. Der Formatierer verwendet die Zeitzone jedes Geräts.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Suche gibt gültiges JSON mit einem leeren Ergebnisarray zurück. Ihr Handler zeigt die allgemeine Fehlermeldung und lässt die Schaltfläche deaktiviert. Welcher Zustandswechsel passt zu diesem Ergebnis?
  1. Leeren Erfolg anzeigen, Ladezustand behalten und weitere Seiten anfordern.
  2. Dienstfehler anzeigen, Ladezustand entfernen und unbegrenzt wiederholen.
  3. Leeren Erfolg anzeigen, Ladezustand entfernen und das Bedienelement wiederherstellen.
  4. Erfolg mit alten Daten anzeigen und das Bedienelement deaktiviert lassen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Übersicht lädt ein Konto in 400 ms und benötigt dann dessen zurückgegebene ID, um ein Team in 200 ms zu laden. Unabhängige Warnungen dauern 700 ms und dürfen fehlschlagen, ohne Kontodaten zu verbergen. Welche Anordnung ermöglicht dieses Verhalten und wie lange dauert sie ungefähr, wenn jeder Lesevorgang erfolgreich ist?
  1. Alle drei gemeinsam starten und bei jedem Fehler die Ansicht verwerfen; etwa 700 ms.
  2. Konto und dann Team parallel zu Warnungen laden, Zweige getrennt behandeln; etwa 700 ms.
  3. Konto, dann Team, dann Warnungen mit gemeinsamem catch laden; etwa 1300 ms.
  4. Konto parallel zu Warnungen laden, Team nach beider Erfolg starten; etwa 900 ms.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein JSON-PATCH an einen anderen Ursprung verwendet credentials: "include". Die Preflight-Anfrage erlaubt es. Die abschließende Antwort hat einen Allow-Origin-Platzhalter und erlaubt Anmeldeinformationen, sodass JavaScript sie nicht lesen kann. Der Server nimmt außerdem an, dass CORS Nutzerprüfungen überflüssig macht. Welche Antwort- und Zugriffsregel behebt diesen Entwurf?
  1. Den Platzhalter behalten, die Erlaubnis für Anmeldeinformationen entfernen und jede Aktion autorisieren.
  2. Den Seitenursprung nennen, Anmeldeinformationen erlauben und CORS als Autorisierung vertrauen.
  3. Den Platzhalter und die Erlaubnis für Anmeldeinformationen behalten, aber jede Aktion autorisieren.
  4. Den Seitenursprung nennen, Anmeldeinformationen erlauben und jede Aktion autorisieren.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Anbieter dokumentiert einen Kartenschlüssel als geeignet für die öffentliche Verwendung im Browser. Welche Konfiguration begrenzt die für diesen Schlüssel erlaubten Websites, API-Operationen und die Gesamtnutzung?
  1. Domains und APIs beschränken und Nutzungskontingente festlegen.
  2. Domains und APIs beschränken, aber die Nutzung unbegrenzt lassen.
  3. APIs und Kontingente beschränken, aber jede Domain erlauben.
  4. Domains und Kontingente beschränken, aber jede API erlauben.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Ladefunktion für Entwürfe parst gespeicherten Text und ruft sofort .map auf. Bei manchen Nutzern liegt gültiges JSON {"version":1,"items":[]} aus älterem Code vor, bei anderen beschädigter Text. Welcher Wiederherstellungsplan behandelt beide Fälle?
  1. Nur Schreibfehler abfangen und jeden geparsten Wert als Array verwenden.
  2. JSON.parse vor dem Aufruf von .map durch JSON.stringify ersetzen.
  3. Lese- und Parserfehler abfangen und die gespeicherte Struktur prüfen oder umwandeln.
  4. Nach dem Parsen ?? [] verwenden und alle Werte außer null als Arrays behandeln.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Laptop meldet navigator.onLine === true, aber ein API-Aufruf wird abgelehnt. Was sollte die Seite über die Verbindung schließen und als Nächstes behandeln?
  1. Die API ist erreichbar; die Ablehnung nur als ungültiges JSON deuten.
  2. Ein Netzwerk wird erkannt, aber die API kann unerreichbar sein; den Anfragefehler behandeln.
  3. Die API ist unerreichbar; das Online-Flag des Browsers auf false ändern.
  4. Die API ist erreichbar; sofort wiederholen, bis eine Antwort zurückkommt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

68 Schlüsselbegriffe, jeweils mit Definition

A

Abfrageparameter
Ein Abfrageparameter ist ein benannter Wert im Teil einer URL nach ?, den ein Endpunkt für Eingaben wie Suchbegriffe oder Seitenbegrenzungen verwendet.
Der Abfrageparameter limit=12 fordert den Suchendpunkt auf, höchstens zwölf Ergebnisse zurückzugeben.
Ablaufzeit
Eine Ablaufzeit bezeichnet das Alter oder den Zeitpunkt, ab dem eine Anwendung einen gespeicherten Wert nicht mehr als aktuell betrachtet, selbst wenn er im Speicher bleibt.
Eine Ablaufzeit von zehn Minuten veranlasst eine Anwendung, die aktuelle Zeit mit der zusammen mit ihrer zwischengespeicherten Antwort gespeicherten Zeit zu vergleichen.
AbortController
Ein AbortController stellt ein Signal für eine abbrechbare Operation bereit und kann durch Aufruf seiner abort-Methode einen Abbruch anfordern.
Die Suche erstellt einen AbortController und übergibt sein Signal an fetch, bevor eine spätere Aktion den Abbruch auslöst.
AbortSignal
Ein AbortSignal verbindet einen Abbruch oder ein Zeitlimit mit einer asynchronen Operation wie fetch und dem laufenden Lesen ihres Antwortkörpers.
Ein AbortSignal aus AbortSignal.timeout(4000) begrenzt eine Anfrage auf vier Sekunden aktive Zeit.
Anfragekörper
Ein Anfragekörper überträgt übermittelte Inhalte an einen Server, etwa einen serialisierten JSON-Datensatz oder Formularfelder in einer Erstellanfrage.
Der Anfragekörper enthält Titel und Text einer Notiz, während die Methode angibt, dass die Notiz erstellt werden soll.
Antwortkörper
Ein Antwortkörper ist der nach den Antwortheadern gesendete Inhalt. Er kann JSON, Text, Binärdaten oder überhaupt keinen Inhalt enthalten.
Die Seite liest den Antwortkörper einmal und behält das resultierende Objekt sowohl zum Rendern als auch zum Filtern.
API-Schlüssel
Ein API-Schlüssel ist eine Anmeldeinformation, die eine aufrufende Anwendung identifiziert, damit ein Anbieter Zugriff steuern, Nutzung zählen und Begrenzungen oder Abrechnung anwenden kann.
Ein im Browser sichtbarer API-Schlüssel kann kopiert werden, daher muss ein geheimer Anbieterschlüssel auf dem aufrufenden Server bleiben.

B

Baseline
Baseline ist die Zusammenfassung von MDN zur Verfügbarkeit einer Funktion in den wichtigsten Browsern und wird zusammen mit detaillierten Angaben zu Kompatibilität und Anforderungen verwendet.
Die Prüfung von Baseline hilft, Browsertests zu planen, bevor die Seite von einer neu erlernten Browser-API abhängt.
Berechtigung
Eine Berechtigung ist eine vom Browser verwaltete Entscheidung, die einer Seite den Zugriff auf eine geschützte Funktion wie den Gerätestandort erlaubt oder verweigert.
Eine gespeicherte Berechtigungsverweigerung kann eine Standortanfrage fehlschlagen lassen, ohne eine zweite Nachfrage anzuzeigen.

C

Cache
Ein Cache ist eine gespeicherte Datenkopie, die wiederholte Arbeit oder Anfragen vermeidet; eine von der Anwendung festgelegte Regel bestimmt, wann sie aktuell ist.
Ein Wetter-Cache kann eine kürzlich erstellte Vorhersage sofort anzeigen, während ein abgelaufener Eintrag eine neue Anfrage auslöst.
Clipboard-API
Die Clipboard-API ermöglicht einer Seite, Inhalte der Systemzwischenablage asynchron zu lesen oder zu schreiben, vorbehaltlich der Regeln für sichere Kontexte und Browserzugriff.
Eine Kopierschaltfläche verwendet nach einem Klick die Clipboard-API und wartet, bevor sie ihre Erfolgsmeldung anzeigt.
CORS
CORS ist der HTTP-Header-Mechanismus, mit dem ein Server Browserskripten anderer Ursprünge das Lesen seiner Antworten erlauben kann.
Die API verwendet CORS, damit eine Seite einer benannten Website ihre Wetterdaten von einem anderen Host lesen kann.
Cross-Site-Scripting
Cross-Site-Scripting ist die Ausführung nicht vertrauenswürdigen Skriptcodes auf einer Seite, die auftreten kann, wenn externe Zeichenketten als HTML interpretiert werden.
Die Verwendung von textContent für API-Titel verhindert die HTML-Interpretation, die Cross-Site-Scripting ermöglichen kann.

D

Debouncing
Debouncing verzögert eine Operation, bis wiederholte Ereignisse pausieren, und setzt die Wartezeit nach jedem Ereignis zurück, sodass eine Folge weniger Aufrufe erzeugt.
Debouncing in einem Suchfeld vermeidet eine separate Anfrage für jeden Tastendruck bei einem schnell eingegebenen Wort.

E

Endpunkt
Ein Endpunkt ist eine API-Adresse, die eine dokumentierte Anfrage für eine Ressource oder Operation akzeptiert, oft mit einer bestimmten HTTP-Methode.
Der Notizen-Endpunkt akzeptiert ein POST, um eine Notiz zu erstellen, und gibt die Kennung des neuen Datensatzes zurück.
Exponentielles Backoff
Exponentielles Backoff verlängert die Wartezeit zwischen Wiederholungsversuchen um einen Multiplikationsfaktor und verringert so die wiederholte Belastung bei einem vorübergehenden Fehler.
Exponentielles Backoff kann innerhalb einer begrenzten Folge von Wiederholungsversuchen eine, zwei und vier Sekunden warten.

F

Feature-Erkennung
Die Feature-Erkennung prüft, ob eine Funktion verfügbar ist, bevor Code sie verwendet, sodass die Seite einen unterstützten Weg oder eine Rückfalllösung wählen kann.
Die Feature-Erkennung mit "geolocation" in navigator entscheidet, ob die Seite den Gerätestandort anbieten kann.
FormData
FormData ist ein Browserobjekt, das Formularfelder und Dateien zum Übermitteln sammelt und fetch das Erstellen eines Multipart-Anfragekörpers ermöglicht.
Wird FormData als Anfragekörper übergeben, kann der Browser das ausgewählte Bild zusammen mit den Textfeldern des Formulars senden.

G

Gebietsschema
Ein Gebietsschema legt Sprach- und regionale Formatierungskonventionen für die Anzeige von Werten wie Datumsangaben, Zahlen und Geldbeträgen fest.
Das Gebietsschema en-US schreibt ein Datum anders als en-GB, selbst wenn beide denselben Zeitpunkt formatieren.
Gemischte Inhalte
Gemischte Inhalte entstehen, wenn eine sichere Seite eine unsichere Ressource anfordert; Browser blockieren HTTP-fetch-Aufrufe von HTTPS-Seiten.
Eine HTTP-Vorhersage-URL verursacht einen Fehler durch gemischte Inhalte, wenn die Wetterseite selbst über HTTPS geladen wird.
Geolocation-API
Die Geolocation-API ist eine Browser-API, die mit der Berechtigung des Nutzers eine geschätzte Geräteposition ermittelt und Erfolg oder Fehler meldet.
Die Geolocation-API kann Koordinaten für eine Vorhersage in der Nähe liefern; nach einer Verweigerung kann eine Stadt eingegeben werden.

H

Header
Ein Header ist ein benannter Wert in einer Anfrage oder Antwort, der den Austausch, seinen Inhalt oder seine Zugriffsanforderungen beschreibt.
Ein Content-Type-Header teilt dem empfangenden Programm mit, dass der zugehörige Körper JSON enthält.
HTTP-Anfrage
Eine HTTP-Anfrage ist eine Nachricht eines Clients an einen Server mit Methode, URL, Headern und bei manchen Operationen einem Anfragekörper.
Die HTTP-Anfrage fordert /books an und enthält einen Abfrageparameter, der die Anzahl der Ergebnisse begrenzt.
HTTP-Antwort
Eine HTTP-Antwort ist die Antwort eines Servers auf eine Anfrage. Sie enthält einen Statuscode, Header und normalerweise einen Körper mit Daten oder einem Fehler.
Die HTTP-Antwort meldet 404 und erklärt in ihrem Körper, dass das angeforderte Buch nicht gefunden wurde.
HttpOnly
HttpOnly ist ein Cookie-Attribut, das verhindert, dass JavaScript der Seite dieses Cookie liest, während es weiterhin bei passenden Anfragen mitgesendet werden kann.
Ein als HttpOnly markiertes Cookie unterscheidet sich von localStorage-Daten, die Skripte auf dem Ursprung lesen können.

I

Idempotenz
Idempotenz bedeutet, dass die Wiederholung einer identischen Operation dieselbe beabsichtigte Auswirkung auf den Serverzustand hat wie ihre einmalige Ausführung.
Das zweimalige Löschen einer Notiz veranschaulicht Idempotenz: Die Notiz bleibt gelöscht, auch wenn sich der zweite Status unterscheidet.
IndexedDB
IndexedDB ist die asynchrone Datenbank des Browsers für größere strukturierte Datenmengen und Dateien, die sich nicht gut für kleine Web-Storage-Aufgaben eignen.
Eine Seite mit einer großen strukturierten Sammlung kann IndexedDB verwenden, statt sie wiederholt als eine einzige Speicherzeichenkette zu schreiben.
Intl.NumberFormat
Intl.NumberFormat ist ein JavaScript-Formatierer, der für ein gewähltes Gebietsschema lesbare Zeichenketten für Zahlen, Währungen, Prozente oder Einheiten erstellt.
Die Seite verwendet Intl.NumberFormat für jeden Preis erneut, statt für jeden Eintrag eine Währungszeichenkette neu zu erstellen.

J

JSON
JSON ist ein Textformat für strukturierte Daten, darunter Objekte und Arrays. Es muss geparst werden, bevor Code seine verschachtelten Werte verwendet.
Die Seite parst JSON und liest das Array in seiner Eigenschaft results, bevor sie Listeneinträge erstellt.

L

Ladezustand
Ein Ladezustand teilt dem Leser mit, dass eine asynchrone Operation läuft, während die Seite auf ihr Ergebnis wartet.
Der Ladezustand zeigt vor Beginn der Anfrage „Suche läuft …“ an und wird entfernt, wenn die Anfrage endet.
Leerzustand
Ein Leerzustand ist die Oberfläche, die angezeigt wird, nachdem eine erfolgreiche Operation keine passenden Daten zurückgegeben hat. Er unterscheidet dieses Ergebnis von einem Fehler.
Der Leerzustand meldet „Keine Datensätze entsprechen deinem Filter“, nachdem die API ein gültiges leeres Array zurückgegeben hat.
Live-Region
Eine Live-Region ist ein Seitenbereich, dessen Inhaltsänderungen von assistiven Technologien angesagt werden können, ohne den Tastaturfokus zu verschieben.
Eine Live-Region mit role="status" sagt „Laden …“ und die spätere Meldung zum Suchergebnis an.
localStorage
localStorage ist der dauerhafte Web-Storage-Bereich eines Ursprungs, der von dessen Tabs geteilt wird und über das Schließen des Browsers hinaus erhalten bleibt, bis er entfernt oder gelöscht wird.
Ein in localStorage gespeichertes Design kann beim nächsten Besuch wiederhergestellt und von einem anderen Tab desselben Ursprungs gelesen werden.

M

Multipart-Trennzeichen
Ein Multipart-Trennzeichen trennt Felder und Dateien in einem Multipart-Körper und wird in dessen Inhaltstyp-Header angegeben.
Der Browser stellt das Multipart-Trennzeichen bereit, wenn die Seite FormData sendet, ohne Content-Type selbst zu setzen.

N

Nullish-Coalescing-Operator
Der Nullish-Coalescing-Operator liefert mit ?? nur dann einen Ersatzwert, wenn sein linker Wert null oder undefined ist, und erhält gültige Nullen.
Der Nullish-Coalescing-Operator erhält eine API-Anzahl von null, statt sie durch den Text „nicht verfügbar“ zu ersetzen.
Nutzeraktivierung
Nutzeraktivierung ist eine vom Browser erkannte Interaktion, etwa ein kürzlich erfolgter Klick, die erforderlich sein kann, bevor eine eingeschränkte Funktion erlaubt wird.
Der direkte Aufruf zum Schreiben in die Zwischenablage in einem Klick-Handler liefert eine Nutzeraktivierung, wo der Browser sie verlangt.

O

Opake Antwort
Eine opake Antwort verbirgt Statusdetails, Header und Körper vor dem Seitencode und gibt den Statuswert null preis.
Ein no-cors-Abruf liefert eine opake Antwort, sodass die Seite das JSON, das sie anzeigen wollte, nicht entnehmen kann.
Optionale Verkettung
Die optionale Verkettung stoppt einen Eigenschaftszugriff sicher, wenn der Wert vor ?. null oder undefined ist, und gibt undefined zurück.
Mit optionaler Verkettung kann book.author?.name ein Buch behandeln, dessen Autorenobjekt in der Antwort fehlt.

P

Paginierung
Paginierung teilt eine Ergebnissammlung in kleinere Gruppen auf, die eine API getrennt zurückgibt, meist über Seiten- oder Cursorparameter.
Durch Paginierung kann eine Schaltfläche „Mehr laden“ die nächste Gruppe anfordern und bereits angezeigte Einträge erhalten.
Parserfehler
Ein Parserfehler tritt auf, wenn Text nicht im erwarteten Format interpretiert werden kann, etwa wenn eine HTML-Seite an eine Methode zum Lesen von JSON übergeben wird.
Ein leerer Körper bei 204 verursacht einen JSON-Parserfehler, obwohl der Server die Operation erfolgreich abgeschlossen hat.
Preflight-Anfrage
Eine Preflight-Anfrage ist eine vom Browser gesendete OPTIONS-Anfrage, die die Berechtigung für eine beabsichtigte Methode und Anfrageheader bei einem anderen Ursprung prüft.
Ein JSON-POST kann eine Preflight-Anfrage benötigen, bevor der Browser den Datensatz sendet, den die Seite erstellen möchte.
Promise.all
Promise.all fasst Eingabe-Promises zu einem Ergebnisarray zusammen, wenn alle erfüllt werden, und wird abgelehnt, sobald ein Eingabe-Promise abgelehnt wird.
Die Seite verwendet Promise.all für zwei unabhängige Lesevorgänge, deren Ergebnisse beide für die Anzeige verfügbar sein müssen.
Promise.allSettled
Promise.allSettled wartet auf jedes Eingabe-Promise und gibt für jedes ein Ergebnisobjekt zurück, das Erfolg oder Fehler enthält.
Promise.allSettled ermöglicht einer Übersicht, zwei erfolgreiche Bereiche anzuzeigen und zugleich den Fehler eines dritten Bereichs zu erklären.

R

Ratenbegrenzung
Eine Ratenbegrenzung beschränkt die Anzahl der Operationen, die ein Client oder eine Anmeldeinformation in einem Zeitintervall ausführen darf, und hilft einem Dienst, die Nutzung zu steuern.
Eine Ratenbegrenzung für die Suche kann durch eine Anfrage pro Tastendruck überschritten werden, daher verringert Debouncing unnötige Aufrufe.
Rendern
Rendern wandelt Daten in sichtbare Seiteninhalte um, etwa indem für jedes Objekt im Ergebnisarray einer API ein Listenelement erstellt wird.
Das Rendern einer neuen Suche beginnt damit, die vorherige Liste zu leeren und dann die aktuellen Ergebniseinträge anzuhängen.
Response-Objekt
Ein Response-Objekt repräsentiert die von fetch zurückgegebenen Header und den Status und stellt Methoden zum Lesen des Antwortkörpers bereit.
Das Response-Objekt hat den Status 200, aber die Seite wartet weiterhin auf json(), um die Buchdaten zu erhalten.
Retry-After
Der Header Retry-After teilt einem Client in einer geeigneten Antwort mit, wann er es erneut versuchen soll, durch eine Wartezeit in Sekunden oder ein HTTP-Datum.
Ein Retry-After-Wert von 15 fordert die Seite auf, vor einer weiteren Anfrage fünfzehn Sekunden zu warten.
Rückfalllösung
Eine Rückfalllösung ist ein alternativer Weg, eine Aufgabe abzuschließen, wenn die bevorzugte Funktion nicht unterstützt wird, verweigert wird oder nicht abgeschlossen werden kann.
Das Markieren eines Linkfelds zum Kopieren per Tastatur bietet eine Rückfalllösung, wenn der automatische Zugriff auf die Zwischenablage fehlschlägt.

S

Same-Origin-Policy
Die Same-Origin-Policy ist eine Sicherheitsgrenze des Browsers, die einschränkt, wie ein Skript Ressourcen eines anderen Ursprungs lesen kann.
Durch die Same-Origin-Policy hängt ein Abruf von einem anderen Ursprung von der CORS-Leseberechtigung des API-Servers ab.
Serialisierung
Serialisierung wandelt einen Wert in ein Format um, das gespeichert oder übertragen werden kann, etwa ein JavaScript-Objekt in JSON-Text.
Die Serialisierung mit JSON.stringify erhält die Felder einer Notiz, wenn sie als JSON-Anfragekörper gesendet werden.
sessionStorage
sessionStorage ist Web Storage, der auf einen Ursprung und die Seitensitzung eines Tabs beschränkt ist und Werte während dieser Sitzung beim Neuladen erhält.
Ein Formular verwendet sessionStorage für Fortschritt, der ein Neuladen überstehen soll, ohne ein gemeinsam genutzter dauerhafter Zustand zu werden.
Sicherer Kontext
Ein sicherer Kontext ist ein Browserkontext, der für eingeschränkte APIs als vertrauenswürdig gilt und normalerweise durch HTTPS oder einen geeigneten lokalen Ursprung bereitgestellt wird.
Ein sicherer Kontext unter localhost unterstützt die Entwicklung, während eine einfache HTTP-Netzwerkadresse die Voraussetzung möglicherweise nicht erfüllt.
Speicherkontingent
Ein Speicherkontingent ist eine vom Browser auferlegte Grenze für gespeicherte Daten; wird der verfügbare Web-Storage-Platz überschritten, kann ein Schreibvorgang einen Fehler auslösen.
Eine Anwendung mit einer Liste im Arbeitsspeicher fängt einen Speicherkontingentfehler ab und verwendet die Liste weiter, selbst wenn sie sie nicht speichern kann.
Standortgenauigkeit
Die Standortgenauigkeit beschreibt die geschätzte horizontale Unsicherheit um eine gemeldete Position und wird in Metern statt in Grad gemessen.
Eine Standortgenauigkeit von 60 Metern beschreibt den geschätzten Unsicherheitsradius um die gemeldete Position.
Statuscode
Ein Statuscode ist ein dreistelliger HTTP-Wert, der das Ergebnis einer Anfrage meldet, etwa Erfolg, Verweigerung oder ein Serverproblem.
Ein Statuscode von 201 teilt der Seite mit, dass der Server als Antwort auf die Anfrage eine Ressource erstellt hat.
storage-Ereignis
Ein storage-Ereignis benachrichtigt andere dafür vorgesehene Kontexte desselben Ursprungs über eine Speicheränderung; ein localStorage-Schreiber erhält sein eigenes Ereignis nicht.
Ein storage-Ereignis aktualisiert das Design in einem anderen Tab, während der schreibende Tab das Design direkt anwendet.
Synchrone Operation
Eine synchrone Operation wird abgeschlossen, bevor die nächste Anweisung fortfährt, sodass ein langer Speicheraufruf den Hauptthread der Seite blockieren kann.
Ein großer Schreibvorgang in Web Storage ist eine synchrone Operation, die die Verarbeitung der nächsten Nutzerinteraktion verzögern kann.

T

textContent
Die Eigenschaft textContent liest oder setzt den Text eines Elements, ohne die übergebene Zeichenkette als HTML-Markup zu interpretieren.
Die Zuweisung eines Titels an textContent zeigt seine spitzen Klammern wörtlich an, statt ein HTML-Element zu erstellen.

U

Unix-Zeitstempel
Ein Unix-Zeitstempel misst die seit dem 1. Januar 1970, UTC, vergangene Zeit; die dokumentierte Einheit kann Sekunden oder Millisekunden sein.
Ein Unix-Zeitstempel in Sekunden muss mit 1000 multipliziert werden, bevor er zu einem JavaScript-Date-Wert wird.
URL-Kodierung
URL-Kodierung stellt Zeichen sicher innerhalb von URL-Bestandteilen dar, damit Satzzeichen in Daten nicht mit der Struktur der Adresse verwechselt werden.
Die URL-Kodierung hält das kaufmännische Und im Namen einer Band innerhalb des Abfragewerts, statt einen neuen Parameter zu beginnen.
Ursprung
Ein Ursprung ist die Kombination aus Schema, Host und Port einer URL, die der Browser zur Festlegung mehrerer Zugriffsgrenzen verwendet.
Zwei Pfade auf einem HTTPS-Host haben denselben Ursprung, aber eine Änderung dieses Hosts oder seines Ports erzeugt einen anderen Ursprung.
UTC
UTC ist die gemeinsame Zeitreferenz zur Bestimmung von Zeitpunkten über Zeitzonen hinweg und wird am Ende einer ISO-Datums- und Uhrzeitangabe durch Z dargestellt.
Die API gibt einen Zeitpunkt in UTC zurück, und die Seite formatiert diesen Zeitpunkt für einen Leser in einer anderen Zeitzone.

W

Währungsuntereinheit
Eine Währungsuntereinheit ist ein Teil der Haupteinheit einer Währung, etwa ein Cent bei USD, den manche APIs für ganzzahlige Beträge verwenden.
Wenn eine API USD-Währungsuntereinheiten dokumentiert, entspricht die Ganzzahl 4680 einem Betrag von 46.80 US-Dollar.
Web Storage
Web Storage stellt synchrone Schlüssel-Wert-Speicher im Browser für kleine Zeichenkettenwerte bereit, getrennt nach Ursprung und gewählter Lebensdauer.
Web Storage hält ein serialisiertes Einstellungsobjekt bereit, das die Seite beim erneuten Start wiederherstellt.
Web-API
Eine Web-API stellt Operationen bereit, die ein Programm über URLs aufruft, um Daten eines anderen Systems zu lesen oder zu ändern.
Eine Wetter-Web-API ermöglicht einer Seite, eine Vorhersage für eine Stadt anzufordern, ohne eine neue Seite zu laden.
Wettlaufsituation
Eine Wettlaufsituation ist ein Ergebnis, das von der Abschlussreihenfolge asynchroner Arbeit abhängt, etwa wenn eine ältere Suche neuere Ergebnisse ersetzt.
Eine Prüfung der Anfragenummer verhindert eine Wettlaufsituation, wenn eine langsamere frühere Suche nach der aktuellen endet.

Z

Zeitzone
Eine Zeitzone bestimmt das lokale Kalenderdatum und die lokale Uhrzeit, mit denen ein Zeitpunkt angezeigt wird, einschließlich geltender Versatzregeln.
Eine ausdrücklich angegebene UTC-Zeitzone sorgt dafür, dass alle Leser die Uhrzeit eines Ereignisses in UTC statt in der Zeitzone ihres Geräts sehen.
Zugriffstoken
Ein Zugriffstoken ist eine Anmeldeinformation, die einen festgelegten Zugriff für einen Nutzer oder eine Sitzung gewährt und ihrem Inhaber erlaubte Anfragen ermöglicht.
Der Authorization-Header der Anfrage übermittelt ein Zugriffstoken für die erlaubte Operation des angemeldeten Nutzers.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten