Bird
Raised Fist0
Astroframework~30 mins

Server endpoints (API routes) in Astro - Mini Project: Build & Apply

Choose your learning style10 modes available
Create a Simple Server Endpoint with Astro
📖 Scenario: You are building a small website using Astro. You want to create a server endpoint that returns a list of fruits as JSON data. This will help your frontend fetch and display the fruits dynamically.
🎯 Goal: Build a server endpoint in Astro that returns a JSON response with a list of fruits.
📋 What You'll Learn
Create a server endpoint file named fruits.ts inside the src/pages/api folder.
Define a list of fruits as an array of strings.
Create a GET handler function that returns the fruits as JSON.
💡 Why This Matters
🌍 Real World
Server endpoints let your website talk to the backend and get or send data dynamically, like fetching a list of items or submitting a form.
💼 Career
Knowing how to create API routes is essential for web developers to build interactive and data-driven web applications.
Progress0 / 3 steps
1
Set up the fruits data array
Create an array called fruits with these exact string values: "apple", "banana", "cherry".
Astro
Hint

Use const fruits = ["apple", "banana", "cherry"]; to create the array.

2
Create the GET handler function
Add an async function called GET that takes a single parameter request.
Astro
Hint

Write export async function GET(request) {} to start the handler.

3
Return the fruits as JSON response
Inside the GET function, return a new Response with the JSON string of fruits and set the header Content-Type to application/json.
Astro
Hint

Use return new Response(JSON.stringify(fruits), { headers: { "Content-Type": "application/json" } }).

Practice

(1/5)
1. What is the main purpose of a server endpoint in Astro?
easy
A. To manage client-side routing
B. To style the website pages
C. To handle incoming HTTP requests and send responses
D. To store user data permanently

Solution

  1. Step 1: Understand what server endpoints do

    Server endpoints are designed to receive requests from clients and send back data or responses.
  2. Step 2: Differentiate from other roles

    Styling, client routing, and data storage are handled elsewhere, not by server endpoints.
  3. Final Answer:

    To handle incoming HTTP requests and send responses -> Option C
  4. Quick Check:

    Server endpoints = handle requests [OK]
Hint: Endpoints handle requests and responses, not styling or routing [OK]
Common Mistakes:
  • Confusing endpoints with client-side routing
  • Thinking endpoints style pages
  • Assuming endpoints store data permanently
2. Which of the following is the correct way to export a GET handler in an Astro server endpoint?
easy
A. function get() { return 'Hello' }
B. export async function GET(context) { return new Response('Hello') }
C. export function get() { return 'Hello' }
D. export async GET() { return 'Hello' }

Solution

  1. Step 1: Recall Astro endpoint syntax

    Astro expects exported async functions named by HTTP method in uppercase, e.g., GET.
  2. Step 2: Check function signature and export

    export async function GET(context) { return new Response('Hello') } correctly exports an async function named GET with a context parameter and returns a Response object.
  3. Final Answer:

    export async function GET(context) { return new Response('Hello') } -> Option B
  4. Quick Check:

    Export async uppercase method function = export async function GET(context) { return new Response('Hello') } [OK]
Hint: Export async functions named GET/POST in uppercase for endpoints [OK]
Common Mistakes:
  • Using lowercase function names
  • Not exporting the function
  • Missing async keyword
  • Returning string instead of Response object
3. Given this Astro endpoint code, what will be the response body when a GET request is made?
export async function GET() {
  return new Response(JSON.stringify({ message: 'Hi' }), { headers: { 'Content-Type': 'application/json' } })
}
medium
A. undefined
B. Hi
C. Error: Missing context parameter
D. {"message":"Hi"}

Solution

  1. Step 1: Analyze the returned Response object

    The function returns a Response with JSON stringified object { message: 'Hi' } and content-type application/json.
  2. Step 2: Determine response body content

    The response body will be the JSON string: {"message":"Hi"} exactly as stringified.
  3. Final Answer:

    "{\"message\":\"Hi\"}" -> Option D
  4. Quick Check:

    JSON.stringify output = {"message":"Hi"} [OK]
Hint: JSON.stringify returns string, so response body is JSON text [OK]
Common Mistakes:
  • Expecting plain text 'Hi' instead of JSON string
  • Confusing response body with object
  • Thinking context parameter is mandatory
4. What is wrong with this Astro endpoint code?
export function POST(request) {
  const data = await request.json();
  return new Response('Received');
}
medium
A. The function must be async to use await
B. POST should be lowercase
C. request.json() is not a valid method
D. Response must be an object, not a string

Solution

  1. Step 1: Check async usage with await

    The function uses await but is not declared async, causing a syntax error.
  2. Step 2: Verify other parts

    POST must be uppercase and exported, request.json() is valid, and Response can take a string body.
  3. Final Answer:

    The function must be async to use await -> Option A
  4. Quick Check:

    Use async with await = The function must be async to use await [OK]
Hint: Use async keyword when using await inside functions [OK]
Common Mistakes:
  • Forgetting async keyword with await
  • Using lowercase HTTP method names
  • Misunderstanding request.json() availability
5. You want to create an Astro server endpoint that accepts a POST request with JSON data containing a "name" field, and responds with a JSON greeting like { "greeting": "Hello, name!" }. Which code snippet correctly implements this?
hard
A. export async function POST({ request }) { const data = await request.json(); return new Response(JSON.stringify({ greeting: `Hello, ${data.name}!` }), { headers: { 'Content-Type': 'application/json' } }); }
B. export function POST(request) { const data = request.json(); return new Response({ greeting: 'Hello, ' + data.name + '!' }); }
C. export async function POST(request) { const data = await request.text(); return new Response(JSON.stringify({ greeting: 'Hello, ' + data + '!' })); }
D. export async function POST() { return new Response(JSON.stringify({ greeting: 'Hello!' })); }

Solution

  1. Step 1: Check correct async POST function with destructured request

    export async function POST({ request }) { const data = await request.json(); return new Response(JSON.stringify({ greeting: `Hello, ${data.name}!` }), { headers: { 'Content-Type': 'application/json' } }); } correctly exports async POST with { request } destructured to access request.json().
  2. Step 2: Verify JSON parsing and response format

    export async function POST({ request }) { const data = await request.json(); return new Response(JSON.stringify({ greeting: `Hello, ${data.name}!` }), { headers: { 'Content-Type': 'application/json' } }); } awaits request.json(), extracts name, and returns JSON response with proper headers.
  3. Final Answer:

    export async function POST({ request }) { const data = await request.json(); return new Response(JSON.stringify({ greeting: `Hello, ${data.name}!` }), { headers: { 'Content-Type': 'application/json' } }); } -> Option A
  4. Quick Check:

    Async POST with request.json() and JSON response = export async function POST({ request }) { const data = await request.json(); return new Response(JSON.stringify({ greeting: `Hello, ${data.name}!` }), { headers: { 'Content-Type': 'application/json' } }); } [OK]
Hint: Use async POST with await request.json() and JSON response headers [OK]
Common Mistakes:
  • Not awaiting request.json()
  • Returning Response with object instead of string
  • Missing Content-Type header for JSON
  • Not destructuring request parameter
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard