在Vapor3,所有内容类型(JSON, protobuf, URLEncodedForm, Multipart, etc)都被同等对待。需要解析和序列号的东西都是遵循Codable
协议的类或结构体。
本文以JSON为例。但要记住对于所有支持的内容类型API都是一样的。
请求
先来看看对如下一个HTTP请求我们是如何进行响应的。
POST /login HTTP/1.1
Content-Type: application/json
{
"email": "user@vapor.codes",
"password": "don't look!"
}
首先,创建一个类或者结构体来表达我们所期望收到的数据格式。然后让它遵循Content
协议。
import Vapor
struct LoginRequest: Content {
var email: String
var password: String
}
然后就能够解析这个请求了。
router.post("login") { req -> Future<HTTPStatus> in
return try req.content.decode(LoginRequest.self).map(to: HTTPStatus.self) { loginRequest in
print(loginRequest.email) // user@vapor.codes
print(loginRequest.password) // don't look!
return .ok
}
}
因为req.content.decode(_:)
返回的数据类型是future,我们在这里用了.map(to:)
进行转换。
响应
接下来让我们看看如何生成如下响应.
HTTP/1.1 200 OK
Content-Type: application/json
{
"name": "Vapor User",
"email": "user@vapor.codes"
}
和解析请求类似,先创建一个结构或者类来表示我们期望的返回类型,并遵循Content
协议。然后就可以编码为HTTP响应了。
import Vapor
struct User: Content {
var name: String
var email: String
}
router.get("user") { req -> User in
return User(
name: "Vapor User",
email: "user@vapor.codes"
)
}
在Vapor中编解码就是如此简单.
网友评论