使用 vapor 3 在同一路线上处理不同种类的 json
Handle different kinds of json on the same route with vapor 3
我正在尝试在我的 Vapor 3 服务器上添加一个 POST 端点以创建新资源,但我想要 3 个不同的 JSON 可以创建该资源的格式。所以我有 3 个不同的 Content
结构,每个都非常相似。
struct IDJson: Content, DeckConvertible {
var name: String?
var format: Int
var hero: Int
var cards: [Int]
}
struct NameJson: Content, DeckConvertible {
var name: String?
var format: Int
var hero: String
var cards: [String]
}
struct DeckstringJson: Content, DeckConvertible {
var name: String?
var deckstring: String
}
我想像这样将它们全部添加到我的路由器
class DeckRouteController: RouteCollection {
func boot(router: Router) throws {
router.post(IDJson.self, at: "user", "collection", use: createDeckHandler)
router.post(NameJson.self, at: "user", "collection", use: createDeckHandler)
router.post(DeckstringJson.self, at: "user", "collection", use: createDeckHandler)
}
}
...
private extension DeckRouteController {
func createDeckHandler(_ request: Request, container: DeckConvertible) throws -> Future<Response> {
// Create deck
}
}
这可能吗?目前只有最后一个被使用但是有没有办法我可以用一些中间件处理程序或其他东西来做到这一点?
您可以在函数本身中处理解码,即:
router.post("user", "collection", use: createDeckHandler)
func createDeckHandler(_ request: Request) throws -> String {
let asId = try? request.content.syncDecode(IDJson.self)
let asName = try? request.content.syncDecode(NameJson.self)
if let asId = asId {
// do stuff
} else if let asName = asName {
// do something else
}
}
我正在尝试在我的 Vapor 3 服务器上添加一个 POST 端点以创建新资源,但我想要 3 个不同的 JSON 可以创建该资源的格式。所以我有 3 个不同的 Content
结构,每个都非常相似。
struct IDJson: Content, DeckConvertible {
var name: String?
var format: Int
var hero: Int
var cards: [Int]
}
struct NameJson: Content, DeckConvertible {
var name: String?
var format: Int
var hero: String
var cards: [String]
}
struct DeckstringJson: Content, DeckConvertible {
var name: String?
var deckstring: String
}
我想像这样将它们全部添加到我的路由器
class DeckRouteController: RouteCollection {
func boot(router: Router) throws {
router.post(IDJson.self, at: "user", "collection", use: createDeckHandler)
router.post(NameJson.self, at: "user", "collection", use: createDeckHandler)
router.post(DeckstringJson.self, at: "user", "collection", use: createDeckHandler)
}
}
...
private extension DeckRouteController {
func createDeckHandler(_ request: Request, container: DeckConvertible) throws -> Future<Response> {
// Create deck
}
}
这可能吗?目前只有最后一个被使用但是有没有办法我可以用一些中间件处理程序或其他东西来做到这一点?
您可以在函数本身中处理解码,即:
router.post("user", "collection", use: createDeckHandler)
func createDeckHandler(_ request: Request) throws -> String {
let asId = try? request.content.syncDecode(IDJson.self)
let asName = try? request.content.syncDecode(NameJson.self)
if let asId = asId {
// do stuff
} else if let asName = asName {
// do something else
}
}