Vapor文档学习卅一: HTTP -Responser

Responder是一个简单的协议,它定义了能够接收Request并返回Response的对象的行为。尤其是在Vapor中,它是连接DropletServer的核心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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容