使用 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
  }
}