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。