如何为 vapor web 框架编写中间件?

How do I write a middleware for vapor web framework?

使用工具箱命令创建了一个新项目:vapor new projectname

在main.swift文件中我添加了中间件代码:

import Vapor
import HTTP

final class VersionMiddleware: Middleware {
    func respond(to request: Request, chainingTo next: Responder) throws -> Response {
        let response = try next.respond(to: request)

        response.headers["Version"] = "API v1.0"
        print("not printing")

        return response
    }
}

let drop = Droplet(availableMiddleware: [
    "version": VersionMiddleware()
])

drop.get("hello") {
    req in 
    return "Hello world"
} 

drop.run()

但是当我 运行 这个时,它打印 "hello world" 但 API 版本没有添加到 headers。我正在使用邮递员检查它。

我认为你应该配置 Config/middleware.json

{
"server": [
    ...
    "version"
],
...
}

会成功的。

middleware document

Vapor 1 ➙ 2 Migration Note: "middleware" ordering configuration has moved from Config/middleware.json to Config/droplet.json.

蒸汽 2

在Vapor 2中,可以按如下方式创建、添加和配置中间件:

Sources/App/Middleware/ExampleMiddleware.swift

final class ExampleMiddleware: Middleware {
  func respond(to request: Request, chainingTo next: Responder) throws -> Response {
    // if needed, process inbound `request` here.
    // Swift.print(request.description)

    // pass next inbound `request` to next middleware in processing chain
    let response: Response = try next.respond(to: request)

    // if needed, process outbound `response` here
    // Swift.print(response.description)

    // return `response` to chain back up any remaining middleware to client
    return response
  }
}

Sources/App/Setup/Config+Setup.swift

extension Config {
  public func setup() throws {
    …
    try setupMiddleware()
    …
  }

  public func setupMiddleware() throws {
    self.addConfigurable(
        middleware: ExampleMiddleware(), 
        name: "example" 
    )     
  }
}

Config/droplet.json

"middleware": [
    …,
    "example"
],

注意:直接包含在Vapor 2中的中间件(如"error"、"sessions"、"file"、"date"、"cors")将用于Config/droplet.json "middleware" 没有 addConfigurable(middleware, name) 设置步骤。

Vapor 2 Docs: Middleware ⇗