我在Kitura中有一个TypeSafe可编码路线,定义如下:
app.router.post("/games") { (auth: BasicAuth, respondWith: @escaping (Game?, RequestError?) -> ()) in
...
}
但是,当我提出请求时,我会收到Could not decode received JSON: The required key 'id' not found.
。好像路由器正在尝试从POST正文而不是从基本auth标头解析auth
对象。如果我将路由更改为GET,则可以正常工作,但我对Type Safe Codeable路由不太了解,并且我对POST路由的更改感到困惑。如何使BasicAuth
在POST上与GET一样工作?
答案 0 :(得分:2)
使用Kitura的Codable路由时,POST处理程序希望从消息正文接收Codable输入。您可以选择指定一个或多个TypeSafeMiddleware要求。
如果要执行POST,则需要匹配将the post() function on Router作为输入的Codable和TypeSafeMiddleware:
app.router.post("/games") { (auth: BasicAuth, input: MyInputType, respondWith: @escaping (Game?, RequestError?) -> ()) in
...
}
您的情况是您实际上在匹配this post() function without TypeSafeMiddleware,其中您的身份验证类型(符合Codable)被解释为输入类型。
如果您不希望为此请求将有效负载发布到服务器,那么您可能想要的是一个GET,它与the get() function on Router匹配,后者仅使用TypeSafeMiddleware作为输入:
app.router.get("/games") { (auth: BasicAuth, respondWith: @escaping (Game?, RequestError?) -> ()) in
...
}
请注意,TypeSafeMiddleware是路由处理程序的第一个参数,其后是任何其他输入类型(对于PUT或POST)。