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
在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正常工作。表明。
规范中未定义任何操作!
如图片所示。
您看过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竞赛中展示的著名图书馆。改进该库的反馈意见倍受赞赏。