Responder是一个简单的协议,它定义了能够接收Request并返回Response的对象的行为。尤其是在Vapor中,它是连接Droplet和Server的核心API。让我们看看它是如何定义的:
public protocol Responder {
func respond(to request: Request) throws -> Response
}
Responser协议和Droplet关系密切,也与Server相联系。一般用户不会和其产生交互。
Simple
当然,Vapor为我们提供了一些便利的方法,在实际当中我们经常会调用:
try drop.run()
Manual
像我们提到的,Vapor的Droplet就遵守了Responser协议,并连接Server。这意味我们如果想手动启动服务器,可以这样做:
let server = try Server<TCPServerStream, Parser<Request>, Serializer<Response>>(port: port)
try server.start(responder: droplet) { error in
print("Got error: \(error)")
}
Advanced
我们可以让自己的对象遵守Responser协议,然后将其传递给服务器。比如下面的例子:
final class Responder: HTTP.Responder {
func respond(to request: Request) throws -> Response {
let body = "Hello World".makeBody()
return Response(body: body)
}
}
这只会为每个请求返回“Hello World”,最常见的用法是与某种特定类型的路由相关联。
final class Responder: HTTP.Responder {
let router: Router = ...
func respond(to request: Request) throws -> Response {
return try router.route(request)
}
}
然后我们将其传给server,并运行服务器:
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)")
}
这可以用作手动实现某些功能的跳出点。
Client
HTTP.Client本身也遵守了Responser协议,但是它不处理Request本身,而是将其传递给底层URI。