Content

在 Vapor 3 中, 所有的内容类型 (JSON, protobuf, URLEncodedForm, Multipart 等) 都被视为相同, 解析和序列化所需的只是一个 Codable 类型或者结构体.

对于本指南, 我们将使用 JSON 举例. 但请记住, 对于任何支持的内容类型, 使用的 API 都是相同的.

Request

让我们看看如何解析下面的 HTTP 请求.

  1. POST /login HTTP/1.1
  2. Content-Type: application/json
  3. {
  4. "email": "user@vapor.codes",
  5. "password": "don't look!"
  6. }

首先, 创建一个表示你期望的数据的结构体或者类.

  1. import Vapor
  2. struct LoginRequest: Content {
  3. var email: String
  4. var password: String
  5. }

然后简单地让这个结构体或者类遵守 Content 协议. 现在我们做好准备解析这个 HTTP 请求了.

  1. router.post("login") { req -> Future<HTTPStatus> in
  2. return req.content.decode(LoginRequest.self).map(to: HTTPStatus.self) { loginRequest in
  3. print(loginRequest.email) // user@vapor.codes
  4. print(loginRequest.password) // don't look!
  5. return .ok
  6. }
  7. }

在这里使用 .map(to:) 因为 req.content.decode(_:) 返回一个 future(期货).

Response

让我们看看该怎么创建以下 HTTP 响应.

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json
  3. {
  4. "name": "Vapor User",
  5. "email": "user@vapor.codes"
  6. }

就像解析一样, 先创建一个表示你期望数据的结构体或者类.

  1. import Vapor
  2. struct User: Content {
  3. var name: String
  4. var email: String
  5. }

然后让这个结构体或者类遵守 Content 协议. 现在我们做好准备序列化这个 HTTP 响应了.

  1. router.get("user") { req -> User in
  2. return User(
  3. name: "Vapor User",
  4. email: "user@vapor.codes"
  5. )
  6. }

现在你知道在 Vapor 中如何序列化和解析数据了!

tip

查看 Vapor → Content 获得更多信息.