APISpec 使得 Swift Vapor 开发者能够使用 Swift 编写 API 文档,然后将这些文档导出为 OpenAPI 3.0 JSON 格式。
要构建一个规范 (spec),你必须使你的类型遵循以下三个协议
Droplet
将遵循此类型。APIOperations
,它代表你的 API 公开的端点。 如果你的控制器遵循 ResourceRepresentable
,并且你的 Resource
模型遵循 APISchemaProviding
,你可以从你的资源生成 APIOperations
。 否则,你必须手动生成 APIOperations
。extension Droplet: APISpecProviding {
public var title: String {
return "Petworld API"
}
public var description: String {
return "The is the API server for Petworld."
}
public var host: String {
return "api.petworld.com"
}
public var schemes: APISchemes {
return .https
}
public var contactEmail: String? {
return "daltonclaybrook@gmail.com"
}
}
extension PetController: APITagProviding {
var name: String {
return "pets"
}
var description: String {
return "Pets have various characteristics such as `name` and `owner`."
}
var operations: [APIOperation] {
// You can generate APIOperations from a Resource where Model conforms to `APISchemaProviding`
return makeResource().makeAPIOperations(withPath: "/pets")
}
}
extension Pet: APISchemaProviding {
static var schemaName: String {
return "Pet"
}
static var properties: [APIProperty] {
return [
APIProperty(name: "name", type: .string(example: "Sparky")),
APIProperty(name: "age", type: .number(example: 3)),
APIProperty(name: "owner", type: .object(type: Owner.self), isRequired: false)
]
}
}
一旦你使用各种协议定义了你的规范,你就可以生成 OpenAPI JSON,它可以被各种工具使用,例如 Swagger UI。 假设你的 Droplet
遵循 APISpecProviding
,你的 Routes 文件可能包含如下内容
import APISpec
extension Droplet {
func setupRoutes() throws {
// ... setup other routes
let tagProviders: [APITagProviding] = [
petController
]
self.get("/docs.json") { _ in
return try self.generateAPISpecResponse(with: tagProviders)
}
}
}