我有一个控制器,我想像这样接受 JSON 的创建操作:
{ "foo": "bar" }
或者像这样:
{ "widget": { "foo": "bar" } }
也就是说,我想接受包含在包含对象中的小部件或小部件。目前,我的控制器的创建操作看起来很像这样:
func createHandler(_ req: Request) throws -> Future<Widget> {
do {
return try req.content.decode(WidgetCreateHolder.self).flatMap(to: Widget.self) {
return createWidget(from: $0.widget)
}
} catch DecodingError.keyNotFound {
return try req.content.decode(WidgetCreateObject.self).flatMap(to: Widget.self) {
return createWidget(from: $0)
}
}
}
WidgetCreateObject
看起来像:
struct WidgetCreateObject { var foo: String? }
WidgetCreateHolder
看起来像:
struct WidgetCreateHolder { var widget: WidgetCreateObject }
也就是说,我的 create 操作应该try
创建一个持有者,但如果失败,它应该捕获错误并尝试创建内部对象 (a WidgetCreateObject
)。但是,当我将此代码部署到 Heroku 并仅使用内部对象 JSON 发出请求时,我在日志中得到了这个:
[ ERROR ] DecodingError.keyNotFound: Value required for key 'widget'. (ErrorMiddleware.swift:26)
即使我试图抓住那个错误!
如何让我的创建操作接受两种不同格式的 JSON 对象?