TaskPOST { name: 'Anna' } to /api/users with proper Content-Type. Parse the returned JSON, log the created user's id (should be 42).
POSTing JSON: method + headers + body
100 XP8 min
Theory
The four-field POST
const r = await fetch("/api/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Anna", age: 30 }),
});Four fields cover 90% of API calls:
methodβ"GET"(default),"POST","PUT","PATCH","DELETE".headersβ Content-Type tells the server how to parse the body; Authorization carries the token.bodyβ what to send. For JSON:JSON.stringify(obj). For form data: aFormDatainstance.
The two body shapes you'll write
// JSON body (most modern APIs)
body: JSON.stringify({ name: "Anna" }),
headers: { "Content-Type": "application/json" },
// Form-urlencoded body (legacy APIs, OAuth)
body: new URLSearchParams({ name: "Anna" }),
// no Content-Type needed β fetch sets application/x-www-form-urlencodedFormData works the same way β fetch detects it and sets the multipart content-type automatically (don't set it manually, you'll mangle the boundary).
Reading the response
const created = await r.json(); // { id: 42, name: "Anna" } if the API returns the created record
console.log(created.id);Most REST APIs return the created resource on POST so the client doesn't need a second round-trip.
Including credentials
fetch(url, { credentials: "include" });By default, fetch does NOT send cookies on cross-origin requests. credentials: "include" opts in. The server must respond with Access-Control-Allow-Credentials: true for the browser to accept.
π
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β card required, cancel anytime.
Sign up β free trial βFirst 10 lessons in each track are free. No card needed for those.