【问题标题】:Public valid REST Api with wolkenkit.io带有 wolkenkit.io 的公共有效 REST Api
【发布时间】:2018-08-18 01:34:53
【问题描述】:

我目前正在评估框架“wolkenkit”[1],以便在应用程序中使用它。在这个应用程序中,我将拥有一个用于基于租户的数据管理的用户界面。只有经过身份验证的用户才能访问此应用程序。

此外,还应该有一个公共 REST API 遵循通用标准并可由公众调用(租户安全性通过在请求标头中提交基于租户的 API 密钥来完成)。

据我所知,wolkenkit REST API 似乎不符合这些 HTTP 动词形式的标准。

但是由于 wolkenkit 在我看来是一个非常灵活且易于使用的框架,我想知道如何基本上实现这样一个公共 API。 可能是例如创建内部连接到 wolkenkit 后端的自己的 Web 应用程序的有效方法?那么额外的性能开销呢?


[1]https://www.wolkenkit.io/

【问题讨论】:

    标签: rest wolkenkit


    【解决方案1】:

    除了mattwaglanswer,我想指出一些你可能感兴趣的事情。

    首先,由于wolkenkit是基于CQRS,所以应用程序有一个单独的读写API。这意味着,如果您发送一个命令(其目的是更改状态),它将转到 write 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 完成,一切都很好 - 当有多个命令(从技术上讲)执行 UPDATE 时,问题就开始了。

    PS:我也是wolkenkit的开发者之一。

    PPS:无论您打算解决这个问题,我都非常有兴趣收到您的来信!如果您能与我们分享您的经验,那就太好了,因为您很可能不是最后一个有这个想法的人。如果您想联系我们,最简单的方法是通过Slack

    【讨论】:

    • 您好,感谢您的回答(当然也感谢@mattwagl)。顺便说一句:我在正确的时间点偶然发现了你的 dotnetpro 系列的 wolkenkit,我不得不为这个新应用程序选择一个新的框架/环境,因为我自己的(现在已经六年多了)CQRS 框架(C#)不包括事件溯源,我犹豫要不要添加它。同时,EventFlow 是一个地狱般的框架——wolkenkit 让我使用了那种非常干净易读的方法。接下来我将研究如何构建一个完整的docker环境。一旦第一个 api 完成,我会及时通知你。
    • 哇,谢谢? ...很想和你讨论细节,所以我非常期待你在 Slack!
    【解决方案2】:

    可以使用 HTTP 和 Websocket-API 访问 wolkenkit 应用程序。这些 API 均由 wolkenkit 在后台使用的 tailwind 模块提供。在 tailwind 存储库中,您可以找到可用 HTTP 路由的a very simple documentation

    你说得对,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

    这些 API 的身份验证当前使用 OpenID-Connect 完成。 a very detailed article 介绍了如何使用 Auth0 设置身份验证。我不太确定这是否适合您的用例,但您基本上可以使用任何遵循此标准或能够发出 JWT 令牌的身份验证服务。

    最后,您还可以通过构建一个在底层使用wolkenkit-client-js 的模块来构建您自己的在浏览器中运行的 JavaScript 客户端 SDK。此 SDK 可以只使用 same API as any other client 连接到您的应用程序。

    希望这会有所帮助。

    PS:请注意我是wolkenkit的作者之一。

    【讨论】:

    • 目前了解。但这就是重点——出于某种原因,我不想将完整的 wolkenkit HTTP-API 公开给公众,而是只公开读取端,并且只针对少数资源。所以-我的应用程序将能够使用整个 API 集,但是从我的应用程序外部进行的公共访问仅限于它的一个子集。或者,拥有一个内部连接到 wolkenkit 读取存储的自己的服务器端应用程序(例如 express)是否是一种有效的方法?
    • 好的,我明白了。对我来说似乎是一种有效的方法。您将创建某种与您的域对话的公共 API 外观。如果您使用 Node.js 执行此操作,则可以使用在浏览器中使用的相同客户端 SDK。另一种方法是使用授权docs.wolkenkit.io/1.2.0/reference/creating-the-write-model/… 限制对特定 writeModel 或 readModel 资源的访问,但如果您想对 API 的设计进行更多控制,第一种方法让您这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多