Vapor 2.0 - JSON

前往 Vapor 2.0 - 文档目录

JSON是Vapor的一个不可分割的部分。它能提供Vapor的配置(Config),并且在请求和响应中都很容易使用。

请求(Request)

request.data中,JSON是自动提供的,同时还有表单URL编码、表单数据和查询数据。这使您可以专注于制作一个很棒的API,而不必担心将会发送什么内容类型的数据。

drop.get("hello") { request in
    guard let name = request.data["name"]?.string else {
        throw Abort(.badRequest)
    }
    return "Hello, \(name)!"
}

这将返回对任何HTTP方法或内容类型的欢迎,其中包括name,包括JSON。

只有JSON(JSON Only)

要特别针对JSON,请使用request.json属性。

drop.post("json") { request in
    guard let name = request.json?["name"]?.string else {
        throw Abort(.badRequest)
    }

    return "Hello, \(name)!"
}

响应(Response)

要使用JSON响应,只需创建一个JSON对象并向其添加值。

rop.get("version") { request in
    var json = JSON()
    try json.set("version", 1.0)
    return json
}

可转换(Convertible)

使您的类和结构的JSON可转换是一种很好的方式与api以一种有组织和DRY的方式进行交互。

能被描绘的(Representable)

当某个对象继承JSONRepresentable时,它就可以转换为JSON。

extension User: JSONRepresentable {
    func makeJSON() throws -> JSON {
        var json = JSON()
        try json.set("id", id)
        try json.set("name", name)
        try json.set("age", age)
        return json
    }
}

现在您可以简单地在您的路由中返回user.makeJSON()

drop.get("users", User.parameter) { req in
    let user = try req.parameters.next(User.self)
    return try user.makeJSON()
}

您甚至可以更进一步,将您的模型与ResponseRepresentable相一致。因为它已经是JSONRepresentable,所以您就可以获得自由的一致性。

extension User: ResponseRepresentable { }

现在您可以自己返回模型了。它将自动调用.makeJSON()

drop.get("users", User.parameter) { req in
    let user = try req.parameters.next(User.self)
    return try user
}

初始化(Initializable)

当某个对象继承JSONInitializable时,它可以从JSON创建。

extension User: JSONInitializable {
    convenience init(json: JSON) throws {
        try self.init(
            name: json.get("name"),
            age: json.get("age")
        )
    }
}

现在您可以简单地调用User(json: ...)来从json创建用户。

drop.post("users") { req in
    guard let json = req.json else {
        throw Abort(.badRequest)
    }

    let user = try User(json: json)
    try user.save()
    return user
}

你可能感兴趣的:(Vapor 2.0 - JSON)