Vapor文檔學(xué)習(xí)卅一: HTTP -Responser

Responder是一個簡單的協(xié)議,它定義了能夠接收Request并返回Response的對象的行為。尤其是在Vapor中,它是連接DropletServer的核心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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容