美文网首页
Vapor文档学习卅一: HTTP -Responser

Vapor文档学习卅一: HTTP -Responser

作者: Supremodeamor | 来源:发表于2017-04-24 16:20 被阅读41次

    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。

    相关文章

      网友评论

          本文标题:Vapor文档学习卅一: HTTP -Responser

          本文链接:https://www.haomeiwen.com/subject/ywspzttx.html