Request¶
app.get("hello", ":name") { req -> String in
let name = req.parameters.get("name")!
return "Hello, \(name)!"
}
它是进入 Vapor 的主要窗口。包含了用于 请求体,查询参数,日志记录器,HTTP 客户端,认证器, 等的 API。 通过请求访问这些功能可以将计算保持在正确的事件循环中,并允许在测试中进行模拟。你甚至可以通过扩展将自己的服务添加到 Request
中。
完整的 Request
API 文档可以在这里找到。
Application¶
Request.application
属性持有对 Application
的引用。 这个对象包含了应用程序的所有配置和核心功能。大部分配置应该只在 configure.swift
中设置,在应用程序完全启动之前进行,许多较低级别的 API 在大多数应用程序中都不会被使用。其中最有用的属性之一 Application.eventLoopGroup
,它可以通过 any()
方法用于需要新的 EventLoop
的进程中获取。它还包含了 Environment
。
Body¶
如果你想以 ByteBuffer
的形式直接访问请求体,可以使用 Request.body.data
。这可以用于从请求体流式传输数据到文件(尽管在这种情况下应该使用请求的 fileio 属性),或者传输到另一个 HTTP 客户端。
Cookies¶
虽然最常见的 cookie 应用是通过内置的会话进行的,但你也可以通过 Request.cookies
直接访问 cookie。
app.get("my-cookie") { req -> String in
guard let cookie = req.cookies["my-cookie"] else {
throw Abort(.badRequest)
}
if let expiration = cookie.expires, expiration < Date() {
throw Abort(.badRequest)
}
return cookie.string
}
Headers¶
通过 Request.headers
访问一个 HTTPHeaders
对象,其中包含了与请求一起发送的所有标头。例如,可以使用它来访问 Content-Type
标头。
app.get("json") { req -> String in
guard let contentType = req.headers.contentType, contentType == .json else {
throw Abort(.badRequest)
}
return "JSON"
}
进一步了解 HTTPHeaders
的文档,请参阅此处。Vapor 还为 HTTPHeaders
添加了几个扩展,以便更轻松地处理最常用的标头;你可以在此处找到扩展列表。
IP Address¶
代表客户端的 SocketAddress
可以通过 Request.remoteAddress
访问,这可能对于日志记录或使用字符串表示的 Request.remoteAddress.ipAddress
进行速率限制很有用。如果应用程序在反向代理后面,则可能无法准确表示客户端的 IP 地址。
app.get("ip") { req -> String in
return req.remoteAddress.ipAddress
}
了解更多 SocketAddress
文档,请参阅此处。