📖 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
Step 1: Understand what server endpoints do
Server endpoints are designed to receive requests from clients and send back data or responses.
Step 2: Differentiate from other roles
Styling, client routing, and data storage are handled elsewhere, not by server endpoints.
Final Answer:
To handle incoming HTTP requests and send responses -> Option C
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
Step 1: Recall Astro endpoint syntax
Astro expects exported async functions named by HTTP method in uppercase, e.g., GET.
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.
Final Answer:
export async function GET(context) { return new Response('Hello') } -> Option B
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
Step 1: Analyze the returned Response object
The function returns a Response with JSON stringified object { message: 'Hi' } and content-type application/json.
Step 2: Determine response body content
The response body will be the JSON string: {"message":"Hi"} exactly as stringified.
Final Answer:
"{\"message\":\"Hi\"}" -> Option D
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
Step 1: Check async usage with await
The function uses await but is not declared async, causing a syntax error.
Step 2: Verify other parts
POST must be uppercase and exported, request.json() is valid, and Response can take a string body.
Final Answer:
The function must be async to use await -> Option A
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
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().
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.
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
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 unknownstrongwhile earning +1 Grip toward your certificate.