Responder是一個簡單的協(xié)議,它定義了能夠接收Request并返回Response的對象的行為。尤其是在Vapor中,它是連接Droplet和Server的核心API。讓我們看看它是如何定義的:
public protocol Responder {
func respond(to request: Request) throws -> Response
}
Responser協(xié)議和Droplet關(guān)系密切,也與Server相聯(lián)系。一般用戶不會和其產(chǎn)生交互。
Simple
當(dāng)然,Vapor為我們提供了一些便利的方法,在實際當(dāng)中我們經(jīng)常會調(diào)用:
try drop.run()
Manual
像我們提到的,Vapor的Droplet就遵守了Responser協(xié)議,并連接Server。這意味我們?nèi)绻胧謩訂臃?wù)器,可以這樣做:
let server = try Server<TCPServerStream, Parser<Request>, Serializer<Response>>(port: port)
try server.start(responder: droplet) { error in
print("Got error: \(error)")
}
Advanced
我們可以讓自己的對象遵守Responser協(xié)議,然后將其傳遞給服務(wù)器。比如下面的例子:
final class Responder: HTTP.Responder {
func respond(to request: Request) throws -> Response {
let body = "Hello World".makeBody()
return Response(body: body)
}
}
這只會為每個請求返回“Hello World”,最常見的用法是與某種特定類型的路由相關(guān)聯(lián)。
final class Responder: HTTP.Responder {
let router: Router = ...
func respond(to request: Request) throws -> Response {
return try router.route(request)
}
}
然后我們將其傳給server,并運(yùn)行服務(wù)器:
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)")
}
這可以用作手動實現(xiàn)某些功能的跳出點(diǎn)。
Client
HTTP.Client本身也遵守了Responser協(xié)議,但是它不處理Request本身,而是將其傳遞給底層URI。