# Request

[`Request`](https://api.vapor.codes/vapor/documentation/vapor/request) 对象被传递到每一个[路由处理程序](../basics/routing.md)中.

```swift
app.get("hello", ":name") { req -> String in
    let name = req.parameters.get("name")!
    return "Hello, \(name)!"
}
```

它是进入 Vapor 的主要窗口。包含了用于 [请求体](../basics/content.md)，[查询参数](../basics/content.md#query)，[日志记录器](../basics/logging.md)，[HTTP 客户端](../basics/client.md)，[认证器](../security/authentication.md), 等的 API。 通过请求访问这些功能可以将计算保持在正确的事件循环中，并允许在测试中进行模拟。你甚至可以通过扩展将自己的[服务](../advanced/services.md)添加到 `Request` 中。

完整的 `Request` API 文档可以在[这里](https://api.vapor.codes/vapor/documentation/vapor/request)找到。

## Application

`Request.application` 属性持有对 [`Application`](https://api.vapor.codes/vapor/documentation/vapor/application) 的引用。 这个对象包含了应用程序的所有配置和核心功能。大部分配置应该只在 `configure.swift` 中设置，在应用程序完全启动之前进行，许多较低级别的 API 在大多数应用程序中都不会被使用。其中最有用的属性之一 `Application.eventLoopGroup`，它可以通过 `any()` 方法用于需要新的 `EventLoop` 的进程中获取。它还包含了 [`Environment`](../basics/environment.md)。

## Body

如果你想以 `ByteBuffer` 的形式直接访问请求体，可以使用 `Request.body.data`。这可以用于从请求体流式传输数据到文件（尽管在这种情况下应该使用请求的 [fileio](../advanced/files.md) 属性），或者传输到另一个 HTTP 客户端。

## Cookies

虽然最常见的 cookie 应用是通过内置的[会话](../advanced/sessions.md#configuration)进行的，但你也可以通过 `Request.cookies` 直接访问 cookie。

```swift
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` 标头。

```swift
app.get("json") { req -> String in
    guard let contentType = req.headers.contentType, contentType == .json else {
        throw Abort(.badRequest)
    }
    return "JSON"
}
```

进一步了解 `HTTPHeaders` 的文档，请参阅[此处](https://swiftpackageindex.com/apple/swift-nio/2.56.0/documentation/niohttp1/httpheaders)。Vapor 还为 `HTTPHeaders` 添加了几个扩展，以便更轻松地处理最常用的标头；你可以在[此处](https://api.vapor.codes/vapor/documentation/vapor/niohttp1/httpheaders#instance-properties)找到扩展列表。

## IP Address

代表客户端的 `SocketAddress` 可以通过 `Request.remoteAddress` 访问，这可能对于日志记录或使用字符串表示的 `Request.remoteAddress.ipAddress` 进行速率限制很有用。如果应用程序在反向代理后面，则可能无法准确表示客户端的 IP 地址。

```swift
app.get("ip") { req -> String in
    return req.remoteAddress.ipAddress
}
```

了解更多 `SocketAddress` 文档，请参阅[此处](https://swiftpackageindex.com/apple/swift-nio/2.56.0/documentation/niocore/socketaddress)。




