`
yixietianxia
  • 浏览: 14082 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

        最近在公司发现了一个非常繁琐的事情(后台采用微服务架构开发):后台提供Rest接口的模块实在太多,每天多要有专门的人员去统计今天对应Rest接口有哪些变更,每次都要花费大量的时间,而且有时候发现统计的还跟实际不统一(统计人员还是非常发心思在做这个事情)!另外,前端开发人员一直等待后端开发人员给接口,每次后端人员都说接口快OK了,但是前端开发人员一点信息也查看不到,导致前端人员心里对进度把握很虚。

 

        为了解决这一困局,今天学习了一下互联网主流的解决方案:采用Swagger进行线上沟通。这的确是一种非常不错的方式!它把我们碰到的问题全全解决了,为做这套开源项目的人员点个赞!另外只要接口发生变更直接通过线上就可以看到,降低了人员之间的沟通成本。

 

       一、改造swagger源码(基于1.5.8版本)

       本身swagger还不支持Dubbox,因此需要我们对它进行扩展。稍微看一下swagger的源码发现,这种改造非常简单,只要把Swagger返回的Response对象通过dubbox的Rest接口暴露出来即可。大家只要关注抽象类BaseApiListingResource,它里面有getListingJsonResponse()和getListingYamlResponse()方法,核心返回给前端的数据就是这两个访问透露出来的。前面有说到这个方法是抽象方法,想必就是提供我们去继承了。于是乎定义Rest接口吧:

DubboxSwaggerService.java 
@Path("dubboxswagger")
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
@Produces({MediaType.APPLICATION_JSON + "; " + "charset=UTF-8", MediaType.TEXT_XML + "; " + "charset=UTF-8"})
public interface DubboxSwaggerService {
	
	 	@GET
	 	@Path("swagger")
	    public Response getListingJson(@Context Application app,
	            @Context ServletConfig sc,@Context HttpHeaders headers,
	            @Context UriInfo uriInfo);
}

 

定义好了接口,我们再写它的实现吧:

DubboxAcceptHeaderApiListingResource.java
@Service
public class DubboxAcceptHeaderApiListingResource extends BaseApiListingResource implements DubboxSwaggerService {
	
	@Context
    ServletContext context;

	@Override
	public Response getListingJson(Application app, ServletConfig sc,
			HttpHeaders headers, UriInfo uriInfo) {
		// TODO Auto-generated method stub
		
		Response rsp = getListingJsonResponse(app, context, sc, headers, uriInfo);

		return rsp;
	}
}

 

 到这里还不是完美的方案,我们要的是一个集中Rest查询中心!每个模块的访问地址都不同,前端JS请求就会涉及跨域问题。一般会报如下错误:Can't read from server. It may not have the appropriate access-control-origin settings。 怎么处理?只要加一段小代码即可解决。把getListingJsonResponse()代码修改一下即可(yaml一样):

 

rsp.header("Access-Control-Allow-Origin", "*");
rsp.header("Access-Control-Allow-Headers","x-requested-with, ssi-token");
rsp.header("Access-Control-Max-Age", "3600");
rsp.header("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS");

 

OK!这样Swagger的修改完成了,打包上传你的私库吧。

 

       二、在dubbox后台开发中使用

       后台使用就只要把需要显示的Rest接口加入注解@api,@ApiOperation,然后配置对应bean即可使用,具体如下:

       1)引入jar包:

		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-core</artifactId>
			<version>你的版本号</version>
		</dependency>
		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-jaxrs</artifactId>
			<version>你的版本号</version>
		</dependency>
		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-jersey-jaxrs</artifactId>
			<version>你的版本号</version>
		</dependency>
		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-jersey2-jaxrs</artifactId>
			<version>你的版本号</version>
		</dependency>
		<dependency>
			<groupId>org.reflections</groupId>
			<artifactId>reflections</artifactId>
			<version>0.9.10</version>
		</dependency>

 

       2)在spring的配置文件里加入:

    <bean id="swaggerService" class="io.swagger.jaxrs.listing.DubboxAcceptHeaderApiListingResource" />
    <bean id="beanConfig" class="io.swagger.jaxrs.config.BeanConfig">
        <property name="schemes" value="http" />
        <!-- com.abc.aa这个值不能写成com.abc.aa.*-->
        <property name="resourcePackage" value="com.abc.aa"/>
        <property name="version" value="1.0"/>
        <property name="host" value="10.10.10.23:8888"/>
        <property name="basePath" value="/test"/>
        <property name="title" value="这个是标题啊"/>
        <property name="description" value="这里是描述呢"/>
        <property name="contact" value="abc"/>
        <property name="license" value="Apache 2.0"/>
        <property name="licenseUrl" value="http://www.apache.org/licenses/LICENSE-2.0.html"/>
        <property name="scan" value="true"/>
    </bean>
    <dubbo:service interface="io.swagger.jaxrs.listing.DubboxSwaggerService" ref="swaggerService"/>

      3)对应的接口加入注解。如:

@Path("abc")
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
@Produces({MediaType.APPLICATION_JSON + "; " + MediaType.CHARSET_PARAMETER + "=UTF-8", MediaType.TEXT_XML + "; " + MediaType.CHARSET_PARAMETER + "=UTF-8"})
@Api("Demo-api")
public interface DemoRestService {

	@GET
    @Path("{id : \\d+}")
	@ApiOperation(value="通过主键获取用户信息")
    Demo getDemo(@PathParam("id") @Min(1) Integer id);
}

 

 恭喜你!要进行的操作完成了。在浏览器输入:http://10.10.10.23:8888/test/dubboxswagger/swagger.json即可看到结果.

 

注意:这里配置的端口号要跟dubbox配置的Rest端口一致。

 

 

 

 

 

 

 

 

 

分享到:
评论
3 楼 lovejavaevil 2017-08-31  
protected Response getListingJsonResponse(
            Application app,
            ServletContext servletContext,
            ServletConfig servletConfig,
            HttpHeaders headers,
            UriInfo uriInfo) {
        Swagger swagger = process(app, servletContext, servletConfig, headers, uriInfo);

        if (swagger != null) {
            ObjectMapper mapper = new ObjectMapper();
            ResponseBuilder rsp = null;
            try {
                mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
                rsp = Response.ok().entity(mapper.writeValueAsString(swagger));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }

        rsp.header("Access-Control-Allow-Origin", "*");
        rsp.header("Access-Control-Allow-Headers","x-requested-with, ssi-token");
        rsp.header("Access-Control-Max-Age", "3600");
        rsp.header("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS");
            return rsp.build();
        } else {
            return Response.status(404).build();
        }
    }
2 楼 lovejavaevil 2017-08-31  
1、报js错误。2、接口重复显示,因为get,put,post,path,delete,options都显示出来,这个是由于生成的json中很多null字符串,我进行了修改
1 楼 lovejavaevil 2017-08-31  
首先感谢前辈提供的swagger-core-1.5.8.zip包,但默认直接匹配swagger-ui存在两个问题

相关推荐

    Swagger与Spring结合生成Restful接口文档

    在与Spring框架结合使用时,Swagger能自动生成接口的JSON描述,并通过UI展示成友好的文档,使得开发者和使用者都能方便地理解API的使用方式。 在Spring项目中集成Swagger,首先需要在`pom.xml`文件中引入相关的依赖...

    swaggerui结合springmvc生成文档

    这个项目是一个配置简单的 Maven 工程,旨在演示如何将 Swagger UI 结合到 Spring MVC 应用中,以自动生成 API 文档。 首先,Swagger UI 是基于 Swagger 的一个用户界面,它允许通过 UI 直观地浏览和测试 API。...

    Springfox(Swagger2)结合Springmvc

    Swagger的主要目标是提供一套完整的、与语言无关的API描述标准,以便开发者能够轻松地构建具有高质量文档的RESTful服务。Springfox通过自动扫描和解析Spring MVC的注解,帮助我们生成Swagger的JSON格式文档,从而...

    swagger和spring Aop日志结合

    本篇文章将深入探讨如何将Swagger与Spring AOP结合起来,以实现优雅的日志记录功能。 首先,让我们了解Swagger的核心功能。Swagger提供了一套规范和完整的框架,用于描述、构建、文档化和测试RESTful APIs。通过...

    dubbox2.8.4.rar

    6. **API 文档自动化**:Dubbox 支持生成基于 Swagger 的 API 文档,方便开发人员理解和使用服务接口,提高开发效率。 7. **异步调用**:Dubbox 支持异步调用模式,对于耗时较长的操作,可以避免阻塞调用线程,提升...

    swagger2Demo,swagger

    在这个项目中,开发者使用Java语言(JDK 1.8)实现了Swagger 2的功能,这表明Swagger不仅支持最新的Java版本,而且与旧版本兼容。 Swagger 2的主要特点包括: 1. **API定义**:通过在代码中添加注解,Swagger 2...

    mybatis 代码自动生成 ,并且自定义注释结合swagger

    总结起来,通过自定义MyBatis的代码生成器,并结合Swagger的注解,我们可以实现高效且规范的代码生成,使得API文档与代码同步更新,提升开发效率和代码质量。在实际项目中,这样的实践对于大型项目尤其有价值,因为...

    swagger_java_swagger_

    在Java环境中,Swagger通常与Spring Boot框架结合使用,以简化API的开发和测试过程。本篇文章将深入探讨如何在Spring Boot项目中集成Swagger,以及它所带来的优势。 首先,Swagger的核心是OpenAPI规范,它定义了...

    Swagger与SpringMVC项目整合jar包

    在与SpringMVC框架整合时,Swagger可以提供一个交互式的文档界面,使得开发者可以通过UI直接测试API,大大提升了开发效率和用户体验。下面将详细介绍Swagger与SpringMVC整合的相关知识点。 1. **Swagger介绍** ...

    swagger所有相关jar包

    这个库包含多个模块,如`springfox-swagger2`用于处理Swagger 2.0规范,`springfox-swagger-ui`则提供了与Swagger UI集成的设施,让开发者在本地就能查看和测试API。 使用Swagger和Springfox,开发者可以实现以下...

    jmeter接口自动化测试插件swagger转jmeter脚本.zip

    二、Swagger简介与应用 Swagger是一款强大的API设计和文档工具,通过规范化的JSON格式定义API接口,可以自动生成易于理解和使用的API文档。Swagger还支持代码生成和测试,便于开发者快速构建和验证API服务。Swagger...

    swaggerUI静态资源包

    Spring的灵活性使得与Swagger的集成变得简单,可以无缝地与Spring MVC或Spring Boot结合。 在提供的压缩包文件中,"swagger"很可能是包含Swagger UI静态资源的文件夹。这些资源包括HTML、CSS、JavaScript等,用于...

    swagger开启身份认证

    这里的`1.9.6`版本可以根据实际情况选择更新的版本,但要注意与项目的兼容性。Swagger Bootstrap UI是一个基于Swagger的UI增强工具,它提供了一套更加友好的API文档展示界面,并支持扩展功能,如本文讨论的身份验证...

    swagger所需jar包大全

    在Spring MVC框架中,Swagger可以与之完美结合,帮助开发人员更轻松地管理API接口。这个"swagger所需jar包大全"包含了使用Swagger进行API文档构建和接口调试所需要的所有关键库。 首先,我们来看`lib`目录下的jar包...

    swagger官方文档离线版

    Swagger官方文档离线版是开发人员和团队在不依赖互联网连接的情况下查阅Swagger 2.0规范的重要资源。Swagger是一个流行的API开发工具,它基于OpenAPI Specification(以前称为Swagger specification),用于设计、...

    swagger静态部分文件打包

    以下是一些与 Swagger 静态部分相关的知识点: 1. **OpenAPI 规范**:Swagger 基于 OpenAPI 规范,这是一种标准的、语言无关的格式,用于描述 RESTful API。它定义了如何编写 API 文档,包括端点、方法、参数、响应...

    swagger2.zip

    springboot 2.2.7集成swagger2.9.2,并生成markdown格式API文档. &lt;!-- swagger2 依赖开始--&gt; &lt;!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --&gt; &lt;groupId&gt;io.springfox ...

    springboot结合Swagger2 api

    Swagger是全球最大的开源API规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发。本篇只介绍如何在Spring boot项目中使用Swagger2,自动为API生成注释和规范API。

    swagger,基于swagger的前端UI实现

    现在市面上的swagger UI不足之处 1、原生UI显示的有些不够漂亮和清晰,特别是request 的model部分 2、每个服务都需要引入一套资源文件,不能作为一个中间件为其他API使用 3、默认通用配置繁琐,每个项目都需要复制...

    ssm与swagger2的整合

    通过下载并解压这个文件,你可以直接运行项目,体验SSM与Swagger2的整合效果。如果在运行过程中遇到问题,可以随时私信寻求帮助。 总结来说,本项目展示了如何在SSM项目中集成Swagger2,以提高接口管理和测试的效率...

Global site tag (gtag.js) - Google Analytics