Swagger API 非标准 Java 技术集成

Swagger API integration for non standard Java technology

我们有一个使用 http POST 和 JSON 作为 RPC 方法的系统。 它是用于内部组件通信的内部解决方案。

请求和响应分别由 Java bean (POJO) 描述。

我的问题是,如何使用 swagger 注释在 swagger 标准中创建漂亮的文档?

我不怕乱用现有代码,但我想知道是否有人对类似的事情有一些经验。

目标是使用 Swagger UI 来显示漂亮的文档并为用户提供一个调用 API 的游乐场。

根据上面的评论,使用 Swagger 无法描述这种 API。 Swagger 规范适用于基于 REST 的 APIs,其中 URLs 用作描述操作的唯一端点,而不是有效负载。

根据定义,Swagger 将独特的操作视为 URL 和 HTTP 方法的组合(例如,有人请求扩展定义以包括 mime 类型,但它是当前不可用)。

根本无法描述操作多个请求类型的单个端点,每个请求类型都有自己的输出。

将来可能可以解决您的要求,但不会在不久的将来,它不会最大限度地满足您的要求。

需要说明的是 - 这不是乱用代码或任何东西的问题。规范本身不支持。

要使 swagger 文件适用于任何通用的手工构建 RPC 应用程序,需要进行 2 项简单的调整。

第一个调整是让 swagger 端点看起来是独一无二的。这是通过在上下文中的哈希后使用唯一名称定义每个端点来完成的。这是可行的,因为您的应用程序不会处理“#”之后的 url,这允许 swagger 将路径视为 "unique"。实际上,虽然这种技术将允许 swagger 文件中定义的每个唯一路径实际调用相同的端点。


  paths:
    /endpoint#myUniqueCommandA
      ...
    /endpoint#myUniqueCommandB
      ...

需要进行其他调整以确保生成的 swagger 客户端实际上会在您的 RPC 应用程序中调用正确的操作。这是通过在每个命令的请求对象中实现一个 "defaulted single value" 枚举来完成的。定义的枚举表示 api 需要传递的相应属性/值组合,以便分派到应用程序内的正确目标操作:


...
    definitions:
      MyUniqueCommandARequest: 
        type: object
        properties: 
          rest_call: 
            type: string
            enum: 
            - myUniqueCommandA
            default: myUniqueCommandA
   ...

      MyUniqueCommandBRequest: 
        type: object
        properties:
          rest_call:
            type: string
            enum: 
            - myUniqueCommandB
            default: myUniqueCommandB
   ...

在上面的示例中,属性 "rest_call" 是我的底层系统用来将请求分派到正确的底层操作的。 myUniqueCommandA 的请求对象将其 rest_call 属性定义为枚举 ["myUniqueCommandA"]。 myUniqueCommandB 的请求对象的 rest_call 属性定义为枚举 ["myUniqueCommandB"].
由于这些被定义为也默认为相同值的单个值枚举,因此调用这些 api 的生成的 swagger 类 将被连接以自动传递其正确的路由值。