1

我在 Kitura 中有一个 TypeSafe Codeable 路由,定义如下:

app.router.post("/games") { (auth: BasicAuth, respondWith: @escaping (Game?, RequestError?) -> ()) in 
    ...
}

但是当我提出 get 请求时,我会收到Could not decode received JSON: The required key 'id' not found.. 这似乎是路由器试图auth从 POST 正文而不是基本身份验证标头中解析对象。如果我将路由更改为 GET,它工作得很好,但我不太了解类型安全可编码路由,而且我对 POST 路由发生的变化感到困惑。如何让我BasicAuth的 POST 与 GET 一样工作?

4

1 回答 1

2

使用 Kitura 的 Codable 路由时,POST 处理程序期望从消息正文接收 Codable 输入。您可以选择指定一个或多个 TypeSafeMiddleware 要求。

如果要执行 POST,则需要匹配Router 上的 post() 函数,该函数将 Codable 和 TypeSafeMiddleware 作为输入:

app.router.post("/games") { (auth: BasicAuth, input: MyInputType, respondWith: @escaping (Game?, RequestError?) -> ()) in 
    ...
}

在您的情况下发生的情况是,您实际上是在没有 TypeSafeMiddleware 的情况下匹配这个 post() 函数,其中您的身份验证类型(符合 Codable)被解释为您的输入类型。

如果您不希望为此请求向服务器 POST 有效负载,那么您可能想要的是一个 GET,它与Router 上的 get() 函数匹配,该函数仅将 TypeSafeMiddleware 作为输入:

app.router.get("/games") { (auth: BasicAuth, respondWith: @escaping (Game?, RequestError?) -> ()) in 
    ...
}

请注意,TypeSafeMiddleware 是路由处理程序的第一个参数,然后是任何其他输入类型(在 PUT 或 POST 的情况下)。

于 2018-07-26T08:36:15.013 回答