Skip to content

Responder

The Responder is a simple protocol defining the behavior of objects that can accept a Request and return a Response. Most notably in Vapor, it is the core API endpoint that connects the Droplet to the Server. Let's look at the definition:

public protocol Responder {
    func respond(to request: Request) throws -> Response
}

The responder protocol is most notably related to Droplet and it's relationship with a server. Average users will not likely interact with it much.

Simple

Of course, Vapor provides some conveniences for this, and in practice, we will often call:

try drop.run()

Manual

As we just mentioned, the Vapor Droplet itself conforms to Responder, connecting it to the Server. This means if we wanted to serve our droplet manually, we could do:

let server = try Server<TCPServerStream, Parser<Request>, Serializer<Response>>(port: port)
try server.start(responder: droplet)  { error in
    print("Got error: \(error)")
}

Advanced

We can conform our own objects to Responder and pass them to Servers. Let's look at an example:

final class Responder: HTTP.Responder {
    func respond(to request: Request) throws -> Response {
        let body = "Hello World".makeBody()
        return Response(body: body)
    }
}

This only returns "Hello World" for every request, it's most commonly going to be linked with a router of some type.

final class Responder: HTTP.Responder {
    let router: Router = ...

    func respond(to request: Request) throws -> Response {
        return try router.route(request)
    }
}

We'll then pass this responder to a server and let it go.

let server = try Server<TCPServerStream, Parser<Request>, Serializer<Response>>(port: port)

print("visit http://localhost:\(port)/")
try server.start(responder: Responder()) { error in
    print("Got error: \(error)")
}

This can be used as a jumping off point for applications looking to implement features manually.

Client

The HTTP.Client is itself a Responder although, instead of handling the Request itself, it passes it on to the underlying URI.