Spring Boot整合Swagger二、Mybatis構建RESTful API

  • 首先推薦一個好玩的網站 ASCll ,能夠把你想要的字母生成文本的圖形,而後copybanner.txt,便可替換Spring Boot的開啓圖標
88    88                                                    
88    88                                                    
88    88                                                    
88    88  ,adPPYba,  8b       d8  ,adPPYba,    88       88  
88    88 a8" "8a `8b     d8' a8P_____88 88 88 88 88 8b d8 `8b d8'  8PP""""""" 88 88 88 88 "8a,   ,a8" `8b,d8' "8b,   ,aa    "8a, ,a88 88 88 `"YbbdP"' "8" `"Ybbd8"' `"YbbdP'Y8 88 88 88 88 "" "" 88 ,adPPYba, 88,dPPYba, 88 88,dPYba,,adPYba, 88 8b,dPPYba, ,adPPYb,d8 I8[ "" 88P'    "8a 88 88P' "88" "8a 88 88P' `"8a a8" `Y88 `"Y8ba, 88 88 88 88 88 88 88 88 88 8b 88 aa ]8I 88 88 88 88 88 88 88 88 88 "8a, ,d88 `"YbbdP"' 88       88 88 88      88      88 88 88       88  `"YbbdP"Y8  
                                                            aa,    ,88  
                                                             "Y8bbdP"   

複製代碼

spring boot

Swagger2

Swagger是一款能夠快速生成符合RESTful風格API並進行在線調試的插件。REST實際上爲Representational State Transfer的縮寫,翻譯爲「表現層狀態轉化」 。若是一個架構符合REST原則,就稱它爲RESTful架構。 實際上,「表現層狀態轉化」省略了主語,完整的說應該是「資源表現層狀態轉化」。什麼是資源Resource?資源指的是網絡中信息的表現形式,好比一段文本,一首歌,一個視頻文件等等;什麼是表現層Reresentational?表現層即資源的展示在你面前的形式,好比文本能夠是JSON格式的,也能夠是XML形式的,甚至爲二進制形式的。圖片能夠是gif,也能夠是PNG;什麼是狀態轉換State Transfer?用戶可以使用URL經過HTTP協議來獲取各類資源,HTTP協議包含了一些操做資源的方法,好比:GET 用來獲取資源, POST 用來新建資源 , PUT用來更新資源,DELETE 用來刪除資源,PATCH 用來更新資源的部分屬性。經過這些HTTP協議的方法來操做資源的過程即爲狀態轉換。html

  • 傳統URL請求和RESTful風格請求的區別
描述	傳統請求	                 方法	          RESTful請求	         方法
查詢	/user/query?name=mrbird      	GET       	/user?name=mrbird	GET
詳情	/user/getInfo?id=1	            GET	        /user/1	            GET
建立	/user/create?name=mrbird	    POST	    /user            	POST
修改	/user/update?name=mrbird&id=1	POST	    /user/1	            PUT
刪除	/user/delete?id=1	            GET	        /user/1	           DELETE
複製代碼

大體能夠總結下傳統請求和RESTful請求的幾個區別:

  • 傳統請求經過URL來描述行爲,如createdelete等;RESTful請求經過URL來描述資源。
  • RESTful請求經過HTTP請求的方法來描述行爲,好比DELETEPOSTPUT等,而且使用HTTP狀態碼來表示不一樣的結果。
  • RESTful請求經過JSON來交換數據。

1、引入Swagger、MySQL 依賴

<!-- MySQL 鏈接驅動依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector}</version>
        </dependency>
        <!-- Spring Boot Mybatis 依賴 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot}</version>
        </dependency>

        <!--使用的Swagger版本爲2.6.1:-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!--ui的界面-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
複製代碼

2、配置 SwaggerConfig

/**
 * author: Created by shiming on 2018/9/26 18:10
 * mailbox:lamshiming@sina.com
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    // 在配置類中添加@EnableSwagger2註解來啓用Swagger2,apis()定義了掃描的包路徑
    @Bean
    public Docket buildDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInf())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.swagger.web"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo buildApiInf() {
        return new ApiInfoBuilder()
                .title("RESTful API 文檔")
                .contact(new Contact("shiming", "https://www.shiming.site/", null))
                .version("1.0")
                .build();
    }
}
複製代碼

3、配置數據庫,建立表

## 數據源配置
spring.datasource.url= jdbc:mysql://localhost:3306/shiming?useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=App123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
複製代碼
  • Navicat建立數據庫一.png

  • 建立數據庫java

DROP TABLE IF EXISTS  `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(25) DEFAULT NULL COMMENT '用戶姓名',
  `user_age` varchar(25) DEFAULT NULL COMMENT '用戶年級',
  `description` varchar(25) DEFAULT NULL COMMENT '用戶描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
複製代碼
  • Navicat建立數據庫二.png
INSERT user VALUES (0,'仕明','25','仕明是個好同窗');
複製代碼

4、測試

{
  "code": "0",
  "message": "success",
  "result": [
    {
      "id": 1,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    },
    {
      "id": 2,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    },
    {
      "id": 3,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    },
    {
      "id": 4,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    },
    {
      "id": 5,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    },
    {
      "id": 6,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    },
    {
      "id": 7,
      "name": "仕明",
      "age": "25",
      "description": "仕明是個好同窗"
    }
  ]
}
複製代碼

數據庫

  • 使用 swagger 刪除id=1的用戶! spring

    image.png

  • 使用 swagger 獲取id=2的用戶! sql

    image.png

{
  "code": "0",
  "message": "success",
  "result": {
    "id": 2,
    "name": "仕明",
    "age": "25",
    "description": "仕明是個好同窗"
  }
}
複製代碼
  • 使用 swagger 更新用戶!

image.png

{
      "id": 7,
      "name": "仕明",
      "age": "25",
      "description": "我更新了-仕明是個好同窗"
    }
複製代碼
  • 更新後的數據庫 數據庫

    image.png

  • UserController的代碼以下api

/**
 * author: Created by shiming on 2018/9/26 16:42
 * mailbox:lamshiming@sina.com
 */

@Api(value = "用戶Controller")
@Controller
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    UserService cityService;

    //{"id":1,"name":"仕明","age":"25","description":"仕明是個好同窗"}
    // http://localhost:8080/user/1
    @ApiOperation(value = "獲取用戶信息", notes = "根據用戶id獲取用戶信息")
    @ApiImplicitParam(name = "id", value = "用戶id", required = true, dataType = "Long", paramType = "path")
    @GetMapping("/{id}")
    @ResponseBody
    public ResultBody getUserById(@PathVariable(value = "id") Long id) throws GlobalErrorInfoException {
        System.out.println("id="+id);
        User userById = cityService.getUserById(id);
        if(userById!=null){
            ResultBody resultBody = new ResultBody(userById);
            return resultBody;
        }
//        User user = new User();
//        user.setDescription("沒有找到這我的");
        throw new GlobalErrorInfoException(GlobalErrorInfoEnum.NOT_FOUND);
       // return user;
    }
    // http://localhost:8080/user/list
    @ApiOperation(value = "獲取用戶列表", notes = "獲取用戶列表")
    @GetMapping("/list")
    @ResponseBody
    public ResultBody getUserList() throws GlobalErrorInfoException {
        List<User> userList = cityService.getUserList();
        if (userList==null||userList.size()==0){
            throw new GlobalErrorInfoException(GlobalErrorInfoEnum.NOT_FOUND);
        }
        ResultBody resultBody = new ResultBody(userList);
        return resultBody;
    }


    @ApiOperation(value = "新增用戶", notes = "根據用戶實體建立用戶")
    @ApiImplicitParam(name = "user", value = "用戶實體", required = true, dataType = "User")
    @PostMapping("/add")
    @ResponseBody
    public ResultBody addUser(@RequestBody User user) {
        Long aLong = cityService.addUser(user);
        System.out.println("Long=="+aLong);
        Map<String, Object> map = new HashMap<>();
        map.put("result", "新增用戶成功");
        ResultBody resultBody = new ResultBody(map);
        return resultBody;
    }

    @ApiOperation(value = "刪除用戶", notes = "根據用戶id刪除用戶")
    @ApiImplicitParam(name = "id", value = "用戶id", required = true, dataType = "Long", paramType = "path")
    @DeleteMapping("/{id}")
    @ResponseBody
    public ResultBody deleteUser(@PathVariable(value = "id") Long id) {
        Long aLong = cityService.deleteUser(id);
        System.out.println("along="+aLong);
        System.out.println("刪除掉的id="+id);
        Map<String, Object> map = new HashMap<>();
        map.put("result", "刪除成功");
        ResultBody resultBody = new ResultBody(map);
        return resultBody;
    }
    @ApiOperation(value = "更新用戶", notes = "根據用戶id更新用戶")
    @ApiImplicitParams(@ApiImplicitParam(name = "user", value = "用戶實體", required = true, dataType = "User"))
    @PutMapping("/{id}")
    @ResponseBody
    public  ResultBody updateUser(@RequestBody User user) {
        System.out.println(user.toString());
        Long aLong = cityService.updateUser(user);
        System.out.println("aLong="+aLong);
        Map<String, Object> map = new HashMap<>();
        map.put("result", "更新成功");
        ResultBody resultBody = new ResultBody(map);
        return resultBody;
    }
}

複製代碼

Swagger經常使用註解

  • @Api:修飾整個類,描述Controller的做用;

  • @ApiOperation:描述一個類的一個方法,或者說一個接口;

  • @ApiParam:單個參數描述;

  • @ApiModel:用對象來接收參數;

  • @ApiProperty:用對象接收參數時,描述對象的一個字段;

  • @ApiResponse:HTTP響應其中1個描述;

  • @ApiResponses:HTTP響應總體描述;

  • @ApiIgnore:使用該註解忽略這個API;

  • @ApiError :發生錯誤返回的信息;

  • @ApiImplicitParam:一個請求參數;

  • @ApiImplicitParams:多個請求參數。

  • 編寫RESTful API接口

    • Spring Boot中包含了一些註解,對應於HTTP協議中的方法:
    • @GetMapping對應HTTP中的GET方法;
    • @PostMapping對應HTTP中的POST方法;
    • @PutMapping對應HTTP中的PUT方法;
    • @DeleteMapping對應HTTP中的DELETE方法;
    • @PatchMapping對應HTTP中的PATCH方法。
  • 本文git地址Swagger2Demo

  • 最後說明幾點

    • 感謝給與我學習的幫助SpringAll
    • RESTful只是一種風格,並非一種強制性的標準。
    • 訪問 http://localhost:8080/swagger-ui.html#/ 就是Swagger UI
    • spring.profiles.active=dev 使用的是開發的環境
    • 爲了使APi返回更加的規整,我使用了ResultBody,來返回給客戶端,若是不寫getXXX的方法的話,IllegalArgumentException: 不合法的參數異常。No converter found for return value of type: 找不到類型返回值的轉換器 .這個類必定得提供。
    • 僅限於學習
相關文章
相關標籤/搜索