我目前正在评估框架" wolkenkit" [1]在应用程序中使用它。在这个应用程序中,我将有一个基于租户的数据管理的用户界面。只有经过身份验证的用户才能访问此应用程序。
此外,应该有一个遵循通用标准的公共REST API,并且可以通过公共调用(在请求标头中提交基于租户的API密钥完成的租户安全性)。
据我所知,wolkenkit REST API似乎不符合HTTP动词形式的这些标准。
但是,由于wolkenkit在我看来是一个非常灵活且易于使用的框架,我想知道如何基本实现这样的公共API。 可能是例如一种有效的方法来创建一个内部连接到wolkenkit后端的自己的Web应用程序?那么额外的性能开销呢?
答案 0 :(得分:1)
可以使用HTTP和Websocket-API访问wolkenkit应用程序。这些API都是由wolkenkit在引擎盖下使用的tailwind
模块提供的。在顺风回购中,您可以找到a very simple documentation可用的HTTP路由。
你是对的,wolkenkit HTTP-API不是经典的REST-API。它更具RPC样式,根据我们的经验,它非常适合应用程序。您的客户/租户只需要支持3条路由:/v1/command
(POST)用于发出命令。您发布的命令应遵循the command schema。 /v1/events
(POST)可用于向客户端传输事件。这些活动将遵循the event schema。最后,您有/v1/read/:modelType/:modelName
(POST)来阅读模型。你可以简单地use HTTPie to test these routes。
目前使用OpenID-Connect对这些API进行身份验证。关于如何使用Auth0设置身份验证的问题a very detailed article。我不太确定这是否适合您的用例,但您基本上可以使用遵循此标准的任何身份验证服务,或者能够发出JWT令牌。
最后,您还可以构建一个在浏览器中运行的JavaScript客户端SDK,方法是构建一个使用引擎盖下的wolkenkit-client-js的模块。此SDK只需使用same API as any other client即可连接到您的应用程序。
希望这有帮助。
PS:请注意我是wolkenkit的作者之一。
答案 1 :(得分:1)
除了answer的mattwagl之外,我想指出一些您可能感兴趣的内容。
首先,由于wolkenkit基于CQRS,因此应用程序有一个单独的API用于编写和阅读。这意味着,如果你发送一个命令(其目的是改变状态),那就转到了写API。如果您订阅事件或运行查询,则会转到读取API。
这再次意味着,如果您发送命令,则由写入端响应它。由于写入方面并不意味着返回应用程序状态,所以它基本上都说:“谢谢,我收到了命令。”要获得实际结果,您必须等待相应的事件,这意味着订阅读取API。
在wolkenkit documentation中有一个很好的图表,以清晰的方式显示:
如果您现在添加一个单独的REST API(实际上满足REST的要求),这意味着您需要在内部处理等待结果的处理。换句话说:wolkenkit中的客户端始终是异步的,而REST则不是。因此,您的工作是在REST API中处理wolkenkit API的异步行为。我认为这是最难的部分。
完成此操作后,您将拥有一个同步REST API,当然它将具有一些开销。但我认为,由于其开销仅限于通过和转换网络请求,因此应该可以忽略不计。
哦,最后,还有另外一件事需要注意:由于REST最初依赖于HTTP动词来传输语义,因此需要将GET / POST / PUT / DELETE映射到语义wolkenkit的命令。只要这可以1:1完成,一切都很好 - 当有多个命令(从技术上讲)进行更新时,问题就开始了。
PS:我也是wolkenkit的开发者之一。
PPS:不过你要解决这个问题,我非常有兴趣收到你的来信!如果你能与我们分享你的经历,那将是非常好的,因为你很可能不是最后一个有这个想法的人。如果您想与我们联系,最简单的方法是通过Slack。