关于rest:Swagger grails集成

Swagger grails Integration

我对swagger还是陌生的,我想使用grails框架将swagger集成到Restful API项目中。如果有人知道我在做什么错,请帮忙吗?

我的grails规格如下:

1
2
3
    | Grails Version: 3.0.7
    | Groovy Version: 2.4.4
    | JVM Version: 1.8.0_71

为摇摇欲坠进行了一些设置,如下所示:

在build.gradle中:

1
2
3
4
5
6
    dependencies {
        ...
        compile"io.swagger:swagger-core:1.5.3"
        compile"io.swagger:swagger-jaxrs:1.5.3"
        ...
    }

在resources.groovy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    import io.swagger.jaxrs.config.BeanConfig
    beans = {
        swaggerConfig(BeanConfig) {
            def serverUrl ="http://localhost:8080/"
            def hostName ="localhost:8080"
            resourcePackage ="grails.rest.example"
            host = hostName
            basePath ="/api"
            version = 'v0' // Default"1".
            title = 'Core Registration API, Version V0'
            description = 'API for Accessing secured resources'
            contact = '[email protected]'
            license = ''
            licenseUrl = ''
        }

        corsFilter(CorsFilter)
    }

添加了一个控制器ApiDocController.groovy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    package grails.rest.example.apidoc

    import grails.web.mapping.LinkGenerator

    class ApiDocController {
        LinkGenerator grailsLinkGenerator
        def apiDocService
        def index = {
            String basePath = grailsLinkGenerator.serverBaseURL
            render(view: 'index', model: [apiDocsPath:"${basePath}/api/swagger-json"])
            //render(view: 'index', model: [apiDocsPath:"localhost:8080/api/swagger-json"])
            //render(view: 'index', model: [apiDocsPath:"localhost:8080/dist/index.html"])

        }
        def swaggerJson = {
            render apiDocService.generateJSON()
        }
    }

为控制器添加了URLMapping:

1
2
3
4
   "/api/info"(controller: 'ApiDoc')
   "/"(controller: 'Index')
   "500"(controller: 'InternalServerError')
   "404"(controller: 'NotFound')

添加了服务ApiDocService.groovy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    //package com.care.apidoc
    package grails.rest.example.apidoc

    import io.swagger.jaxrs.config.BeanConfig
    import grails.transaction.Transactional
    import io.swagger.util.Json

    @Transactional
    class ApiDocService {

        def swaggerConfig

        /*
         * generates SWAGGer JSON
         */

        def generateJSON() {

            String[] schemes = ["http"] as String[]
            swaggerConfig.setSchemes(schemes)
            swaggerConfig.setScan(true)
            def swagger = swaggerConfig.getSwagger()

            Json.mapper().writeValueAsString(swagger);
        }
    }

在src / main / webapp / dist文件夹中添加了Swagger-ui

1
    with a working customised API URL"http://localhost:8080/api/orders" in index.html

在src / main / groovy / CorsFilter.groovy

中添加了CorsFilter设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    import org.springframework.web.filter.OncePerRequestFilter
    import javax.annotation.Priority
    import javax.servlet.FilterChain
    import javax.servlet.ServletException
    import javax.servlet.http.HttpServletRequest
    import javax.servlet.http.HttpServletResponse

    @Priority(Integer.MIN_VALUE)
    public class CorsFilter extends OncePerRequestFilter {

        public CorsFilter() { }

        @Override
        protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
        throws ServletException, IOException {

            String origin = req.getHeader("Origin");

            boolean options ="OPTIONS".equals(req.getMethod());
            resp.addHeader("Access-Control-Allow-Headers","origin, authorization, accept, content-type, x-requested-with");
            resp.addHeader("Access-Control-Allow-Methods","GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
            resp.addHeader("Access-Control-Max-Age","3600");

            resp.addHeader("Access-Control-Allow-Origin", origin == null ?"*" : origin);
            resp.addHeader("Access-Control-Allow-Credentials","true");

            if (!options) chain.doFilter(req, resp);
        }
    }

启动服务器时。
但是,当我尝试在Swagger UI索引文件中加载API时,订单API正常工作。表明。
规范中未定义任何操作!

如图片所示。
enter


您看过springfox吗?

这里是Heroku中托管的Grails应用程序样本,演示了springfox与其集成以生成Open API规范2.0(fka swagger)中的服务描述的功能。演示的源代码在此处。

您可以在此处观看此演示的实时运行,演示了grails应用程序生成并使用swagger-ui呈现的Open API规范。

使之成为可能的库是springfox-grails-integration库。它即将发布,可能需要一点工作才能使其成为grails插件。有一些有关如何配置此库存储库的初步文档。

注意:这仅适用于grails 3.x

这也是在SHOW US YOUR GRAILS竞赛中展示的著名图书馆。改进该库的反馈意见倍受赞赏。