SwaggerUI+SpringMVC——構建RestFul API的可視化界面

今天給大家介紹一款工具,這個工具目前可預見的好處是:自動維護最新的接口文檔。
我們都知道,接口文檔是非常重要的,但是隨着代碼的不斷更新,文檔卻很難持續跟着更新,今天要介紹的工具,完美的解決了這個問題。而且,對於要使用我們接口的人來說,不需要在給他提供文檔,告訴他地址,一目瞭然。 最近項目中一直有跟接口打交道,恰好又接觸到了一個新的接口工具,拿出來跟大家分享一下。 關於REST接口,我在上篇文章中已經有介紹,這裏來說一下如何配合SwaggerUI搭建RestFul API 的可視化界面。最終要達到的效果是這樣的: 它可以支持Rest的所有提交方式,如POST,GET,PUT,DELETE等。 這裏可以看到我們的方法註釋,需要的參數,參數的類型和註釋,返回值的類型註釋等信息,最重要的,我們這裏可以直接對REST接口測試。 接下來,我們一起開始逐步實現如圖的效果 第一步:首先,引入依賴的jar包

<span style="white-space:pre">	</span><!-- swagger -->
<dependency>
<groupId>com.mangofactory</groupId>
<artifactId>swagger-springmvc</artifactId>
<version>0.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.4</version>
</dependency>

第二步,創建swagger配置文件類,基本不用改,只需要修改要匹配的方法路徑即可。

package com.gochina.mis.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.mangofactory.swagger.configuration.SpringSwaggerConfig;
import com.mangofactory.swagger.models.dto.ApiInfo;
import com.mangofactory.swagger.plugin.EnableSwagger;
import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;
@Configuration
@EnableSwagger
public class SwaggerConfig {
private SpringSwaggerConfig springSwaggerConfig;
@Autowired
public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
this.springSwaggerConfig = springSwaggerConfig;
}
@Bean
public SwaggerSpringMvcPlugin customImplementation()
{
        return new SwaggerSpringMvcPlugin(this.springSwaggerConfig).apiInfo(apiInfo()).includePatterns("/album/*");//這裏是支持正則匹配的,只有這裏配置了纔可以在頁面看到。
}
private ApiInfo apiInfo() {
ApiInfo apiInfo = new ApiInfo(null,null,null,null,null,null);
return apiInfo;
}
}

第三步:把配置文件類加入spring容器

<span style="white-space:pre">	</span><!--swagger-->
<bean class="com.gochina.mis.util.SwaggerConfig"/>

到這裏,我們後臺的環境代碼就完成了,接着,添加SwaggerUI提供的js界面 下載swagger-ui
將dist下的文件放入webapp下
配置mvc:resource,防止spring攔截。

<span style="white-space:pre">		</span><mvc:resources mapping="/api-doc/**" location="/api-doc/" />

將index.html中的 修改爲http://localhost:8080/{projectname}/api-docs
到此,完成了所有的基本配置,接下來,需要對每個接口添加註解。 下面來個實例 接口類

package com.gochina.mis.api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.gochina.mis.bean.Album;
import com.gochina.mis.bean.ResultPo;
import com.gochina.mis.service.AlbumService;
import com.gochina.mis.util.JsonUtil;
import com.gochina.mis.util.StringUtil;
import .BaseVo;
import .RequestAlbumVo;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
@Controller
public class AlbumAction {
private static Logger logger = LoggerFactory.getLogger(AlbumAction.class);
@Autowired
private AlbumService albumService;
@ResponseBody
@RequestMapping(value="album", method = RequestMethod.POST,produces = "application/json;charset=utf-8")
@ApiOperation(value="第三方添加專輯", httpMethod ="POST", response=BaseVo.class, notes ="第三方添加專輯")
public String postAlbum(@ModelAttribute("requestAlbumVo")RequestAlbumVo requestAlbumVo){
BaseVo result = new BaseVo();
Album album = new Album();
if (requestAlbumVo!=null) {
("傳入參數:requestAlbumVo:{}",JsonUtil.beanToJson(requestAlbumVo));
try {
BeanUtils.copyProperties(requestAlbumVo, album);
result=albumService.save(album);
} catch (Exception e) {
e.printStackTrace();
result.setSuccess(false);
result.setMsg("添加專輯失敗!");
logger.error("添加專輯失敗傳入參數:requestAlbumVo:{},錯誤信息爲:{}",JsonUtil.beanToJson(requestAlbumVo),e.getMessage());
}
}else {
result.setSuccess(false);
result.setMsg("參數不合法!");
}
("傳入參數:requestAlbumVo:{},返回結果爲:{}",JsonUtil.beanToJson(requestAlbumVo),JsonUtil.beanToJson(result));
return JsonUtil.beanToJson(result);
}
}

我們可以看到,這裏使用SpringMVC,請求參數傳入的是實體類,對於傳入參數的註解,就放到了實體中 請求參數實體

package ;
import com.wordnik.swagger.annotations.ApiModelProperty;
public class RequestAlbumVo {
@ApiModelProperty(value = "專輯名稱", required = true)
private String name;
@ApiModelProperty(value = "第三方專輯Id", required = true)
private String thirdAlbumId;//第三方專輯Id
@ApiModelProperty(value = "第三方專輯Id", required = true)
private String thirdSystemId;//第三方系統Id
@ApiModelProperty(value = "標準圖", required = false)
private String standardPic;//標準圖
@ApiModelProperty(value = "豎圖", required = false)
private String ystandardPic;//豎圖
@ApiModelProperty(value = "水印圖片", required = false)
private String markPic;//水印圖片
@ApiModelProperty(value = "水印圖片位置", required = false)
private String markPosition;//水印圖片位置
@ApiModelProperty(value = "標籤", required = false)
private String tag;//標籤
@ApiModelProperty(value = "評分", required = false)
private String score;//評分
@ApiModelProperty(value = "描述", required = false)
private String description;//描述
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getThirdAlbumId() {
return thirdAlbumId;
}
public void setThirdAlbumId(String thirdAlbumId) {
this.thirdAlbumId = thirdAlbumId;
}
public String getThirdSystemId() {
return thirdSystemId;
}
public void setThirdSystemId(String thirdSystemId) {
this.thirdSystemId = thirdSystemId;
}
public String getStandardPic() {
return standardPic;
}
public void setStandardPic(String standardPic) {
this.standardPic = standardPic;
}
public String getYstandardPic() {
return ystandardPic;
}
public void setYstandardPic(String ystandardPic) {
this.ystandardPic = ystandardPic;
}
public String getMarkPic() {
return markPic;
}
public void setMarkPic(String markPic) {
this.markPic = markPic;
}
public String getMarkPosition() {
return markPosition;
}
public void setMarkPosition(String markPosition) {
this.markPosition = markPosition;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

返回參數,這裏也是用的實體

package ;
import java.sql.Timestamp;
import com.wordnik.swagger.annotations.ApiModelProperty;
/**
* 返回信息
* @author LBQ-PC
*
*/
public class BaseVo {
/**
* 狀態
*/
@ApiModelProperty(value = "狀態")
private Boolean success;
/**
* 消息
*/
@ApiModelProperty(value = "消息")
private String msg;
/**
* 服務器當前時間
*/
@ApiModelProperty(value = "服務器當前時間戳,sample: 1434553831")
private Long currentTime = new Timestamp(System.currentTimeMillis()).getTime();
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String message) {
this.msg = message;
}
public Long getCurrentTime() {
return currentTime;
}
public void setCurrentTime(Long currentTime) {
this.currentTime = currentTime;
}
}

運行訪問:http://localhost:8080/api-doc/index.html ,當然,我們也可以對這個頁面加權限驗證
大功告成!對於開發人員來說,每個接口只需要添加一些註解,SwaggerUI會自動生成如我們文章開始時展現的頁面,方便調用和測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章