4.5. Swagger 集成


概述

您可以使用 Swagger 服务为 CamelContext 文件中的任何 REST 定义路由和端点创建 API 文档。要做到这一点,使用带有 camel-swagger-java 模块的 Camel REST DSL,该模块纯是基于 Java 的。camel-swagger-java 模块会创建一个 servlet,它与 CamelContext 集成,并从每个 REST 端点拉取信息,以 JSON 或 YAML 格式生成 API 文档。

如果使用 Maven,请编辑 pom.xml 文件,以对 camel-swagger-java 组件添加依赖项:

<dependency>
   <groupId>org.apache.camel</groupId>
   <artifactId>camel-swagger-java</artifactId>
   <version>x.x.x</version>
   <!-- Specify the version of your camel-core module. -->
</dependency>

配置 CamelContext 以启用 Swagger

要在 Camel REST DSL 中启用 Swagger API,请调用 apiContextPath () 来设置 Swagger 生成的 API 的上下文路径。例如:

public class UserRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        // Configure the Camel REST DSL to use the netty4-http component:
        restConfiguration().component("netty4-http").bindingMode(RestBindingMode.json)
            // Generate pretty print output:
            .dataFormatProperty("prettyPrint", "true")
            // Set the context path and port number that netty will use:
            .contextPath("/").port(8080)
            // Add the context path for the Swagger-generated API documentation:
            .apiContextPath("/api-doc")
                .apiProperty("api.title", "User API").apiProperty("api.version", "1.2.3")
                // Enable CORS:
                .apiProperty("cors", "true");

        // This user REST service handles only JSON files:
        rest("/user").description("User rest service")
            .consumes("application/json").produces("application/json")
            .get("/{id}").description("Find user by id").outType(User.class)
                .param().name("id").type(path).description("The id of the user to get").dataType("int").endParam()
                .to("bean:userService?method=getUser(${header.id})")
            .put().description("Updates or create a user").type(User.class)
                .param().name("body").type(body).description("The user to update or create").endParam()
                .to("bean:userService?method=updateUser")
            .get("/findAll").description("Find all users").outTypeList(User.class)
                .to("bean:userService?method=listUsers");
    }
}

Swagger 模块配置选项

下表中描述的选项可让您配置 Swagger 模块。设置如下选项:

  • 如果您使用 camel-swagger-java 模块作为 servlet,请通过更新 web.xml 文件设定选项,并为您要设置的每个配置选项指定一个 init-param 元素。
  • 如果您使用 Camel REST 组件的 camel-swagger-java 模块,请通过调用适当的 RestConfigurationDefinition 方法来设置选项,如 enableCORS ()host ()contextPath ()。使用 RestConfigurationDefinition.apiProperty () 方法设置 api.xxx 选项。
选项类型描述

api.contact.email

字符串

用于 API 相关关系的电子邮件地址。

api.contact.name

字符串

要联系的人员或机构的名称。

api.contact.url

字符串

网站 URL 以获取更多信息。

apiContextIdListing

布尔值

如果您的应用程序使用多个 CamelContext 对象,则默认行为是仅列出当前 CamelContext 中的 REST 端点。如果您希望运行 REST 服务的 JVM 中每个 CamelContext 中的 REST 端点列表,请将此选项设置为 true。当 apiContextIdListing 为 true 时,SwagSet 会输出 root 路径中的 CamelContext ID,例如 /api-docs,作为 JSON 格式的名称列表。要访问 Swagger-generated 文档,请将 REST 上下文路径附加到 CamelContext ID,例如 api-docs/myCamel。您可以使用 apiContextIdPattern 选项过滤此输出列表中的名称。

apiContextIdPattern

字符串

过滤在上下文列表中出现的 CamelContext ID 的模式。您可以指定正则表达式,并使用 * 作为通配符。这与 Camel Intercept 功能使用的模式匹配工具相同。

api.license.name

字符串

用于 API 的许可证名称。

api.license.url

字符串

用于 API 的许可证的 URL。

api.path

字符串

设置要生成文档的 REST API 的路径,例如 /api-docs。指定相对路径。不要指定,例如 httphttpscamel-swagger-java 模块在运行时以以下格式计算绝对路径: protocol://host:port/context-path/api-path

api.termsOfService

字符串

API 服务条款的 URL。

api.title

字符串

应用程序的标题。

api.version

字符串

API 的版本。默认值为 0.0.0。

base.path

字符串

必需。设置 REST 服务可用的路径。指定相对路径。也就是说,不要指定 httphttpscamel-swagger-java modul 在运行时以以下格式计算绝对路径: protocol://host:port/context-path/base.path

CORS

布尔值

是否启用 HTTP 访问控制(CORS)。这可让 CORS 只能查看 REST API 文档,而不适用于访问 REST 服务。默认值为 false。建议是使用 CorsFilter 选项,如此表后所述。

主机

字符串

设置运行 Swagger 服务的主机的名称。默认为根据 localhost 计算主机名。

scheme

字符串

要使用的协议方案。使用逗号分隔多个值,例如 "http,https"。默认值为 http

swagger.version

字符串

Swagger 规格版本。默认值为 2.0。

使用 CORS 过滤器启用 CORS 支持

如果您使用 Swagger 用户界面查看您的 REST API 文档,则可能需要启用对 HTTP 访问控制(CORS)的支持。当 Swagger 用户界面托管并在主机名/端口上运行时,需要这个支持,它与运行 REST API 的主机名/端口不同。

要启用对 CORS 的支持,请将 RestSwaggerCorsFilter 添加到 web.xml 文件中。CORS 过滤器添加启用 CORS 的 HTTP 标头。例如:

<!-- Enable CORS filter to allow use of Swagger UI for browsing and testing APIs. -->
<filter>
     <filter-name>RestSwaggerCorsFilter</filter-name>
     <filter-class>org.apache.camel.swagger.rest.RestSwaggerCorsFilter</filter-class>
</filter>
<filter-mapping>
     <filter-name>RestSwaggerCorsFilter</filter-name>
     <url-pattern>/api-docs/*</url-pattern>
     <url-pattern>/rest/*</url-pattern>
</filter-mapping>

RestSwaggerCorsFilter 为所有请求设置以下标头:

  • Access-Control-Allow-Origin= *
  • access-Control-Allow-Methods = GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH
  • access-Control-Max-Age = 3600'
  • access-Control-Allow-Headers = Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers

RestSwaggerCorsFilter 是一个简单的过滤器。如果您需要阻止某些客户端或为给定客户端设置标题值,您可能需要更复杂的过滤器。

获取 JSON 或 YAML 输出

从 Camel 2.17 开始,camel-swagger-java 模块支持 JSON 和 YAML 格式的输出。要指定您想要的输出,请将 /swagger.json/swagger.yaml 添加到请求 URL。如果请求 URL 没有指定格式,则 camel-swagger-java 模块会检查 HTTP Accept 标头来检测是否可以接受 JSON 或 YAML。如果接受或不将 none 设置为 accepted,则 JSON 是默认的返回格式。

例子

在 Apache Camel 分发中,camel-example-swagger-cdicamel-example-swagger-java 演示使用 camel-swagger-java 模块。

增强 Swagger 生成的文档

从 Camel 2.16 开始,您可以通过定义名称、描述、数据类型、参数类型等参数详情来增强 Swagger 生成的文档。如果使用 XML,请指定 param 元素来添加此信息。以下示例演示了如何提供 ID path 参数的信息:

<!-- This is a REST GET request to view information for the user with the given ID: -->
<get uri="/{id}" outType="org.apache.camel.example.rest.User">
     <description>Find user by ID.</description>
     <param name="id" type="path" description="The ID of the user to get information about." dataType="int"/>
     <to uri="bean:userService?method=getUser(${header.id})"/>
</get>

以下是 Java DSL 中的相同示例:

.get("/{id}").description("Find user by ID.").outType(User.class)
   .param().name("id").type(path).description("The ID of the user to get information about.").dataType("int").endParam()
   .to("bean:userService?method=getUser(${header.id})")

如果您定义了名称为 body 的参数,那么您还必须将 body 指定为该参数的类型。例如:

<!-- This is a REST PUT request to create/update information about a user. -->
<put type="org.apache.camel.example.rest.User">
     <description>Updates or creates a user.</description>
     <param name="body" type="body" description="The user to update or create."/>
     <to uri="bean:userService?method=updateUser"/>
</put>

以下是 Java DSL 中的相同示例:

.put().description("Updates or create a user").type(User.class)
     .param().name("body").type(body).description("The user to update or create.").endParam()
     .to("bean:userService?method=updateUser")

另请参阅 Apache Camel 分发中的 example/camel-example-servlet-rest-tomcat

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.