Swift Academy · Lesson

Routing and Request Handling

Define routes and handle HTTP requests.

Lesson 1 of 413 steps

Routing and Request Handling is a free Swift Academy lesson on CoddyKit. This is lesson 1 of 4. Any 3 lessons of this learning path are free to read in full — after that, CoddyKit PRO unlocks every lesson, plus hands-on practice with a built-in code editor and a 24/7 AI tutor. It is part of the Swift Academy learning path, and your progress syncs across the web and the CoddyKit app. The Swift Academy course includes 4 lessons in total.

What Is Vapor?

Vapor is a popular server-side Swift web framework built on SwiftNIO. It lets you write HTTP backends — APIs, websites — entirely in Swift, sharing language and even models with your iOS app.

import Vapor

let app = try await Application.make(.detect())

The Application and Routes

The Application object is the heart of a Vapor server. You register routes on it: mappings from an HTTP method and path to a handler closure that returns a response.

app.get("hello") { req in
    "Hello, world!"
}

HTTP Method Helpers

Vapor exposes a helper per HTTP verb: app.get, app.post, app.put, app.patch, and app.delete. Each takes path components and a handler.

app.post("users") { req in
    "Created a user"
}
app.delete("users") { req in
    "Deleted a user"
}

Path Segments

Pass multiple string segments to build nested paths. The call below responds to GET /api/v1/status.

app.get("api", "v1", "status") { req in
    "OK"
}

Route Parameters

Use a colon-prefixed segment to capture a dynamic value. Read it from the request with req.parameters.get(_:). Below, requesting /users/42 captures 42.

app.get("users", ":id") { req -> String in
    let id = req.parameters.get("id") ?? "unknown"
    return "User id is " + id
}

Typed Parameters

You can convert a parameter to a concrete type by passing the type to get. If conversion fails, Vapor automatically returns a 404, keeping handlers clean.

app.get("posts", ":id") { req -> String in
    let id = try req.parameters.require("id", as: Int.self)
    return "Post number " + String(id)
}

Query Parameters

Read URL query items via req.query. For /search?term=swift, you can decode the term directly. Missing optional values simply come back as nil.

app.get("search") { req -> String in
    let term = try req.query.get(String.self, at: "term")
    return "Searching for " + term
}

Route Groups

Group related routes under a shared prefix with app.grouped(...). This avoids repeating path components and keeps related endpoints together.

let users = app.grouped("users")
users.get { req in "List users" }      // GET /users
users.post { req in "Create user" }    // POST /users

Returning Different Response Types

A handler can return a String, an HTTPStatus, a custom Content type, or a fully built Response. Vapor knows how to encode each into an HTTP reply.

app.delete("cache") { req -> HTTPStatus in
    // clear something
    return .noContent // 204
}

Throwing Errors with Abort

Throw Abort(_:) to short-circuit a request with a specific HTTP status and optional reason. Vapor turns it into a clean JSON error response.

app.get("secret") { req -> String in
    guard req.headers.first(name: "X-Key") == "open" else {
        throw Abort(.forbidden, reason: "Missing key")
    }
    return "Welcome"
}

Async Handlers

Vapor 4+ fully supports async/await. Mark the handler closure async and use try await inside for database or network work.

app.get("ping") { req async throws -> String in
    try await Task.sleep(for: .milliseconds(10))
    return "pong"
}

Quick Check: Routing

Confirm your routing knowledge.

Recap: Routing and Request Handling

You can now wire up a Vapor server:

  • Register routes with app.get/post/put/patch/delete and path segments.
  • Capture dynamic values with :param and read them via req.parameters (typed with require(_:as:)).
  • Read query items from req.query, group routes with grouped.
  • Return strings, statuses, or content; throw Abort for errors; use async handlers.
Free to start

Learn Swift with an AI tutor — free

Write and run real code in your browser, get instant help from a 24/7 AI tutor, and pick up where you left off on the web or in the app.

Courses
122
Lessons
409

Frequently Asked Questions

Is the “Routing and Request Handling” lesson free?

Yes — any 3 lessons of the Swift Academy learning path, including “Routing and Request Handling”, are free to read in full here on the web. After that, CoddyKit PRO unlocks every lesson, plus interactive practice with a built-in code editor and a 24/7 AI tutor. The Swift Academy course includes 4 lessons in total.

What will I learn in “Routing and Request Handling”?

Define routes and handle HTTP requests. You practise Swift Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.

Do I need any experience to start Swift Academy?

No prior experience is required. Swift Academy on CoddyKit is structured for beginners through advanced learners, so you can start here or from the beginning and move at your own pace. This is lesson 1 of 4.

How long does the “Routing and Request Handling” lesson take?

Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.

Can I write and run code in this Swift Academy lesson?

Yes. Every Swift Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.

All lessons in this course

  1. Routing and Request Handling
  2. Content and JSON Encoding
  3. Fluent ORM and Models
  4. Middleware and Authentication
← Back to Swift Academy