MockAPI
Tilføj en demo-profil
Brug kun opdigtede navne og e-mailadresser.
Opret først en gratis MockAPI-konto og en resource, fx profiles, med felterne name og email. Brug kun opdigtede testdata; endpointet er ikke en sikker database.
endpoint.getEntries():
fetch;res.ok;Error, hvis requesten fejler;res.json().addEntry(entry) på samme måde, men med POST, JSON-header og JSON.stringify(entry).busy-state under requesten.Listen bygges med createElement() og textContent. Data fra et API må ikke uden videre interpoleres ind i innerHTML.
<main>
<section class="signup" aria-labelledby="signup-title">
<p class="eyebrow">MockAPI</p>
<h1 id="signup-title">Tilføj en demo-profil</h1>
<p>Brug kun opdigtede navne og e-mailadresser.</p>
<form id="profile-form" aria-labelledby="signup-title">
<div class="form-group">
<label for="name">Navn</label>
<input id="name" name="name" autocomplete="name" required>
</div>
<div class="form-group">
<label for="email">E-mail</label>
<input id="email" name="email" type="email" autocomplete="email" required>
</div>
<button>Tilføj profil</button>
<p class="status" id="api-status" role="status"></p>
<p class="error" id="api-error" role="alert"></p>
</form>
</section>
<section class="profiles" aria-labelledby="profiles-title">
<h2 id="profiles-title">Profiler</h2>
<div id="entries" aria-labelledby="profiles-title"></div>
</section>
</main>
const endpoint = ""
const form = document.querySelector("#profile-form")
const submitButton = form.querySelector("button")
const statusMessage = document.querySelector("#api-status")
const errorMessage = document.querySelector("#api-error")
const entries = document.querySelector("#entries")
async function getEntries() {
// Hent profilerne fra dit endpoint.
return []
}
async function addEntry(entry) {
// Send entry som JSON med POST, og returnér den oprettede profil.
return entry
}
function createEntryElement(entry) {
const article = document.createElement("article")
const heading = document.createElement("h3")
const email = document.createElement("p")
article.className = "entry"
heading.textContent = entry.name
email.textContent = entry.email
article.append(heading, email)
return article
}
async function renderEntries(successMessage = "") {
if (!endpoint) {
statusMessage.textContent = "Indsæt først dit eget MockAPI-endpoint i JavaScript."
return
}
entries.ariaBusy = "true"
errorMessage.textContent = ""
try {
const data = await getEntries()
const fragment = document.createDocumentFragment()
data.forEach(entry => {
fragment.append(createEntryElement(entry))
})
entries.replaceChildren(fragment)
statusMessage.textContent = successMessage || `${data.length} profiler hentet.`
} catch (error) {
errorMessage.textContent = error.message
} finally {
entries.ariaBusy = "false"
}
}
async function handleSubmit(event) {
event.preventDefault()
if (!endpoint) {
errorMessage.textContent = "Indsæt først dit eget MockAPI-endpoint."
return
}
const data = Object.fromEntries(new FormData(form))
submitButton.disabled = true
form.ariaBusy = "true"
statusMessage.textContent = "Gemmer profil…"
errorMessage.textContent = ""
try {
const entry = await addEntry(data)
form.reset()
await renderEntries(`${entry.name} blev tilføjet.`)
} catch (error) {
errorMessage.textContent = error.message
} finally {
submitButton.disabled = false
form.ariaBusy = "false"
}
}
form.addEventListener("submit", handleSubmit)
if (endpoint) {
renderEntries()
}
Fetch-syntaks
const res = await fetch(endpoint)
if (!res.ok) {
throw new Error("Kunne ikke hente profiler")
}
return res.json()