1. 程式人生 > >引入swagger(1)——與傳統spring整合

引入swagger(1)——與傳統spring整合

Swagger是一個rest api文件解決方案。對於有手機端app的企業來說,維護一套api文件是一件麻煩的事情,app端和後端人員的溝通將浪費過多時間。如果人數不夠,單元測試也是麻煩的事情。Swagger是一個很好的解決方案。

        Swagger的整合準備分兩篇文章簡紹

        1、與傳統spring整合

        2、與spring-boot整合

        spring-boot相當方便,還是建議大家新的工程都用spring-boot

        pom

swagger2開始已經融合到springfox中了,因此依賴如下:

<!--springfox依賴-->
		<dependency>
		    <groupId>com.mangofactory</groupId>
		    <artifactId>swagger-springmvc</artifactId>
		    <version>1.0.2</version>
		</dependency>
		<!--jackson依賴-->
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.4.2</version>
		</dependency>
		<!--靜態頁面依賴的webjar-->
		<dependency>
		    <groupId>org.webjars.bower</groupId>
		    <artifactId>swagger-ui</artifactId>
		    <version>2.1.8-M1</version>
		</dependency>
		<dependency>
		    <groupId>com.google.guava</groupId>
		    <artifactId>guava</artifactId>
		    <version>15.0</version>
		</dependency>
		 <!-- springmvc annotation-driven 所需包 -->
        <dependency>
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-validator</artifactId>
		</dependency>

         注意這裡的swagger-ui版本為2.1.8,下載swagger-ui的時候一定要下載配套的版本,不然會出現找不到api文件的提示

        配置

        既然現在都是用spring4,那就別用xml來配置了,這裡提供java config

import javax.servlet.ServletContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.mangofactory.swagger.configuration.SpringSwaggerConfig;
import com.mangofactory.swagger.models.dto.ApiInfo;
import com.mangofactory.swagger.paths.RelativeSwaggerPathProvider;
import com.mangofactory.swagger.plugin.EnableSwagger;
import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;

@Configuration
@EnableWebMvc
@EnableSwagger
public class SpringfoxConfig extends WebMvcConfigurerAdapter {

	public static String PROJECT_NAME;
    
    @Autowired
    private ServletContext servletContext;

    static {
        PROJECT_NAME = "xxx的api";
    }

    private SpringSwaggerConfig springSwaggerConfig;

    @Autowired
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
        this.springSwaggerConfig = springSwaggerConfig;
    }

    /**
     * 鏈式程式設計 來定製API樣式
     * 後續會加上分組資訊
     *
     * @return
     */
    @Bean
    public SwaggerSpringMvcPlugin customImplementation() {
    	
    	RelativeSwaggerPathProvider swaggerPathProvider = new RelativeSwaggerPathProvider(servletContext);
    	
    	swaggerPathProvider.setApiResourcePrefix("rest");
    	
        return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
                .apiInfo(apiInfo())
                .includePatterns(".*")
                .pathProvider(swaggerPathProvider)
                .apiVersion("0.0.1");
    }

    private ApiInfo apiInfo() {
        ApiInfo apiInfo = new ApiInfo(
                PROJECT_NAME + " API",
                PROJECT_NAME + " xxxAPI文件",
                "http://localhost/api-doc/index.html",
                "
[email protected]
", "xxx", "xxx" ); return apiInfo; } }
       

注意,通過RelativeSwaggerPathProvider來設定相對路徑,比如你的rest介面路徑都是以/rest開頭,那麼就需要通過該類進行設定。此外,還有一個絕對地址的設定類。

給一個比較全面的配置地址

http://grepcode.com/file/repo1.maven.org/maven2/com.mangofactory/swagger-springmvc/0.8.7/com/mangofactory/swagger/configuration/SpringSwaggerConfig.java#SpringSwaggerConfig.0servletContext

swagger-ui

下載相應版本的swagger-ui,比如這裡用swaggr-ui 2.1.5。如果版本不對,那麼將找不到rest api

將dist資料夾放到web容器中。如果前後端沒有分離,放到webroot或webapp下。如果使用nginx進行前後端分離,那麼將dist放到相應的資料夾中,比如我建立一個

api-doc資料夾,並把dist檔案中的內容放入其中。

修改index.html檔案,將請求路徑換成rest介面根路徑+api-docs,比如:http://localhost/ecouponApi/rest/api-docs

加入header資訊

大部分情況,手機端的身份驗證需要通過http header來進行,為了使用header,需要在介面方法上加上如下注釋

 @ApiImplicitParams({
        @ApiImplicitParam(paramType="header", name = "xytkj-auth-token", value = "token", required = true, dataType = "String")
    })
最後說一下,同樣可以使用@ModelAttribute和@PathVariable來進行引數指定

@ApiImplicitParam和@ApiParam

@ApiImplicitParam的query型別引數可以通過request獲取,和@RequestParam為獨立的引數。@ApiParam僅僅註解request上的引數

比如:以下配置是錯誤的

 @ResponseBody
    @RequestMapping(value = "/loginout", method = RequestMethod.POST)
    @ApiOperation(value="退出登入", notes="退出登入")
    @ApiImplicitParams({
        @ApiImplicitParam(paramType="header", name = "xytkj-auth-token", value = "令牌", required = true, dataType = "String"),
        @ApiImplicitParam(paramType="query", name = "phone", value = "電話號碼", required = true, dataType = "String"),
        @ApiImplicitParam(paramType="query", name = "sign", value = "簽名", required = true, dataType = "String")
    })
    public void loginout(
    		@RequestParam("phone") String phone,
            @RequestParam("sign") String sign,  
            HttpServletRequest request,
            HttpServletResponse response) throws SysException {

}

正確寫法如下
 @ResponseBody
    @RequestMapping(value = "/loginout", method = RequestMethod.POST)
    @ApiOperation(value="退出登入", notes="退出登入")
    @ApiImplicitParams({
        @ApiImplicitParam(paramType="header", name = "xytkj-auth-token", value = "令牌", required = true, dataType = "String")
    })
    public void loginout(
    		@ApiParam(required=true,value="電話",name="phone")
    		@RequestParam("phone") String phone,
    		@ApiParam(required=true,value="簽名",name="sign")
            @RequestParam("sign") String sign,  
            HttpServletRequest request,
            HttpServletResponse response) throws SysException {

}

訪問api文件

地址為:swagger-ui的index.html

最後看下效果