ThinkPHP与Gin框架之集成SwaggerApi接口文档生成工具

开发 前端
SwaggerApi 接口文档只需要在相应代码的位置写上对应的注释,便可以通过工具生成文档,这种方式极大的简化了写接口文档的工作量。

大家好,我是码农先森。

想必大家对接口文档都不陌生了,程序员有件很苦恼的事情就是「最讨厌别人的项目不写接口文档,但是又最讨厌自己来写文档」说的是不是你哈哈。虽然很讨厌,但是你也没有办法啊,毕竟人还得吃饭,又不能提桶跑路。其实写接口文档并不全是坏处,好处也是很多的,比如可以减少前后端的扯皮成本、清晰的接口文档可以让对方闭嘴、避免大家乱甩锅等等。

在之前我也不喜欢写接口文档,也不喜欢写注释,然后过一段时间来看自己的代码,结果一脸懵逼自己都看不懂了,我相信大家也这种经历吧,所以嘛有时间还是得写写,避免出现自己挖坑自己跳的尴尬局面。那么这次我主要分享的内容是 SwaggerApi 接口文档,不过有人会质疑了这个东西不是大家都会用了吗?但是我想说的是,你会用但是不代表所有人都会哦,所以呢这篇文章主要是分享给那些还未曾使用过这个工具的人,希望对这些人能有所帮助。

话不多说,开整!我们先来看一下整体的项目目录结构,内容主要分为 PHP 和 Go 两部分。

[manongsen@root php_to_go]$ tree -L 2
.
├── go_swagger
│   ├── app
│   │   ├── controller
│   │   │   └── user.go
│   │   └── route.go
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── php_swagger
│   ├── app
│   │   ├── command
│   │   │   └── Swagger.php
│   │   ├── controller
│   │   │   └── User.php
│   ├── composer.json
│   ├── composer.lock
│   ├── config
│   ├── public
│   │   |── swagger-ui
│   │   └── swagger.json
│   ├── route
│   │   └── app.php
│   ├── think
│   ├── vendor
│   └── .env

ThinkPHP

使用 composer 创建基于 ThinkPHP 框架的 php_swagger 项目。

## 当前目录
[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/php_swagger

## 安装 ThinkPHP 框架
[manongsen@root php_swagger]$ composer create-project topthink/think php_swagger
[manongsen@root php_swagger]$ cp .example.env .env

## 安装 Swagger 相关 Composer 扩展包
[manongsen@root php_swagger]$ composer require zircote/swagger-php
[manongsen@root php_swagger]$ composer require doctrine/annotations

执行 php think make:command Swagger 命令,创建一个用于生成 Swagger 文档的脚本。

<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use app;

use OpenApi\Generator;

class Swagger extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('app\command\swagger')
            ->setDescription('the app\command\swagger command');
    }

    protected function execute(Input $input, Output $output)
    {
        $openapi = \OpenApi\Generator::scan([__DIR__ . '/../../app/controller/']);
        file_put_contents(__DIR__ . '/../../public/swagger.json', $openapi->toJson());        
        $output->writeln('执行成功, 接口文档请访问 http://127.0.0.1:8000/swagger-ui/dist/index.html');

        // 指令输出
        $output->writeln('app\command\swagger');
    }
}

在 php_swagger 项目中执行 php think make:Controller User 命令,创建一个 User 控制器。

<?php

namespace app\controller;

use OpenApi\Annotations as OA;
use app\BaseController;

/**
 * @OA\Info(title="ThinkPHP框架之用户中心系统 API", version="1.0")
 */
class User extends BaseController
{
    /**
     * @OA\Get(
     *    description="用户详情",
     *    path="/api/v1/user/info",
     *    @OA\Parameter(in="query", required=true, name="user_id", @OA\Schema(type="integer"), description="用户ID"),
     *    @OA\Response(
     *        response=200,
     *        description="返回数据",
     *        @OA\JsonContent(type="object",
     *            @OA\Property(property="code", type="int"),
     *            @OA\Property(property="message", type="string"),
     *            @OA\Property(property="data", type="object",
     *              @OA\Property(property="user_id", type="integer"),
     *              @OA\Property(property="user_name", type="string"),
     *              @OA\Property(property="mobile", type="string"),
     *              @OA\Property(property="email", type="string"),
     *            ),
     *         ),
     *     ),
     *     @OA\Response(response=401, description="Unauthorized"),
     *     @OA\Response(response=404, description="Not Found"),
     * )
     */
    public function info()
    {
        // TODO::自行实现具体的业务逻辑
    }

    /**
     * @OA\Get(
     *    description="用户列表",
     *    path="/api/v1/user/list",
     *    @OA\Parameter(in="query", required=false, name="page_size", @OA\Schema(type="integer"), description="页码"),
     *    @OA\Parameter(in="query", required=false, name="page_limit", @OA\Schema(type="integer"), description="条数"),
     *    @OA\Response(
     *        response=200,
     *        description="返回数据",
     *        @OA\JsonContent(type="object",
     *            @OA\Property(property="code", type="int"),
     *            @OA\Property(property="message", type="string"),
     *            @OA\Property(property="data", type="array",
     *                @OA\Items(type="object",
     *                    @OA\Property(property="user_id", type="integer"),
     *                    @OA\Property(property="user_name", type="string"),
     *                    @OA\Property(property="mobile", type="string"),
     *                    @OA\Property(property="email", type="string"),
     *                ),
     *            ),
     *         ),
     *     ),
     *     @OA\Response(response=401, description="Unauthorized"),
     *     @OA\Response(response=404, description="Not Found"),
     * )
     */
    public function list()
    {
        // TODO::自行实现具体的业务逻辑
    }

    /**
     * @OA\Post(
     *     description="创建用户",
     *     path="/api/v1/user/create",
     *     @OA\RequestBody(required=true,description="请求数据",content={
     *       @OA\MediaType(mediaType="application/json",
     *           @OA\Schema(
     *               @OA\Property(
     *                   property="username",
     *                   type="string",
     *                   description="用户名"
     *               ),
     *               @OA\Property(
     *                   property="phone",
     *                   type="string",
     *                   description="手机号",
     *               ),
     *               @OA\Property(
     *                   property="email",
     *                   type="string",
     *                   description="邮箱",
     *               )
     *           )
     *       )
     *      }),
     *    @OA\Response(
     *        response=200,
     *        description="返回数据",
     *        @OA\JsonContent(type="object",
     *            @OA\Property(property="code", type="int"),
     *            @OA\Property(property="message", type="string"),
     *         ),
     *     ),
     *     @OA\Response(response=401, description="Unauthorized"),
     *     @OA\Response(response=404, description="Not Found"),
     * )
     * )
     */
    public function create()
    {
        // TODO::自行实现具体的业务逻辑
    }


    /**
     * @OA\Post(
     *     description="更新用户",
     *     path="/api/v1/user/update",
     *     @OA\RequestBody(required=true, description="请求数据", content={
     *       @OA\MediaType(mediaType="application/json",
     *           @OA\Schema(
     *               @OA\Property(
     *                   property="user_id",
     *                   type="integer",
     *                   description="用户ID",
     *               ),
     *               @OA\Property(
     *                   property="username",
     *                   type="string",
     *                   description="用户名"
     *               ),
     *               @OA\Property(
     *                   property="phone",
     *                   type="string",
     *                   description="手机号",
     *               ),
     *               @OA\Property(
     *                   property="email",
     *                   type="string",
     *                   description="邮箱",
     *               )
     *           )
     *       )
     *      }),
     *    @OA\Response(
     *        response=200,
     *        description="返回数据",
     *        @OA\JsonContent(type="object",
     *            @OA\Property(property="code", type="int"),
     *            @OA\Property(property="message", type="string"),
     *        ),
     *     ),
     *     @OA\Response(response=401, description="Unauthorized"),
     *     @OA\Response(response=404, description="Not Found"),
     * )
     * )
     */
    public function update()
    {
        // TODO::自行实现具体的业务逻辑
    }
}

先执行 php think swagger 生成 Swagger 文档,然后再执行 php think run 运行项目,最后在浏览器上访问地址 http://127.0.0.1:8000/swagger-ui/dist/index.html 即可看到实际效果。

图片图片

Gin

通过 go mod 初始化 go_swagger 项目。

## 当前目录
[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/go_swagger
[manongsen@root go_swagger]$ go mod init go_swagger

## 安装 Gin 框架 
[manongsen@root go_swagger]$ go get github.com/gin-gonic/gin

## 安装 Swagger 相关依赖库
[manongsen@root go_swagger]$ go get github.com/swaggo/files
[manongsen@root go_swagger]$ go get github.com/swaggo/gin-swagger

## 安装 Swagger 文档生成工具
[manongsen@root go_swagger]$ go install github.com/swaggo/swag/cmd/swag@latest

在 go_swagger 项目中创建 user 控制器。

package controller

import (
 "github.com/gin-gonic/gin"
)

type UserStruct struct {
 UserId   string `json:"user_id"`
 UserName string `json:"user_name"`
 Mobile   string `json:"mobile"`
 Email    string `json:"email"`
}

type UserInfoRespose struct {
 Code    int        `json:"code" `
 Message string     `json:"message"`
 Data    UserStruct `json:"data"`
}

// @BasePath /api/v1
// 用户信息
// @Summary 用户信息
// @Schemes
// @Description 用户信息
// @Tags user
// @Produce json
// @Param id path int true  "用户ID"
// @success 200 {object} UserInfoRespose{data=UserStruct} "返回数据"
// @failure 401 string Unauthorized "Unauthorized"
// @failure 404 string NotFound "Not Found"
// @Router /user/info [get]
func UserInfo(c *gin.Context) {
 // TODO::自行实现具体的业务逻辑
}

type UserListRespose struct {
 Code    int           `json:"code" `
 Message string        `json:"message"`
 Data    []*UserStruct `json:"data"`
}

// @BasePath /api/v1
// 用户列表
// @Summary 用户列表
// @Schemes
// @Description 用户列表
// @Tags user
// @Produce json
// @Param page_size path int true  "页码"
// @Param page_limit path int true  "条数"
// @success 200 {object} UserListRespose{data=[]UserStruct} "返回数据"
// @failure 401 string Unauthorized "Unauthorized"
// @failure 404 string NotFound "Not Found"
// @Router /user/list [get]
func UserList(c *gin.Context) {
 // TODO::自行实现具体的业务逻辑
}

type CreateUserRequest struct {
 UserName string `json:"user_name"`
 Mobile   string `json:"mobile"`
 Email    string `json:"email"`
}

type CreateUserRespose struct {
 Code    int    `json:"code" `
 Message string `json:"message"`
}

// @BasePath /api/v1
// 创建用户
// @Summary 创建用户
// @Schemes
// @Description 创建用户
// @Tags user
// @Accept json
// @Produce json
// @Param req body CreateUserRequest true "创建用户"
// @success 200 {object} CreateUserRespose{} "返回数据"
// @failure 401 string Unauthorized "Unauthorized"
// @failure 404 string NotFound "Not Found"
// @Router /user/create [post]
func CreateUser(c *gin.Context) {
 // TODO::自行实现具体的业务逻辑
}

type UpdateUserRequest struct {
 UserId   string `json:"user_id"`
 UserName string `json:"user_name"`
 Mobile   string `json:"mobile"`
 Email    string `json:"email"`
}

type UpdateUserRespose struct {
 Code    int    `json:"code" `
 Message string `json:"message"`
}

// @BasePath /api/v1
// 更新用户
// @Summary 更新用户
// @Schemes
// @Description
// @Tags user
// @Accept json
// @Produce json
// @Param req body UpdateUserRequest true "更新用户"
// @success 200 {object} UpdateUserRespose{} "返回数据"
// @failure 401 string Unauthorized "Unauthorized"
// @failure 404 string NotFound "Not Found"
// @Router /user/update [post]
func UpdateUser(c *gin.Context) {
 // TODO::自行实现具体的业务逻辑
}

先执行 swag init 命令生成 Swagger 文档,然后再执行 go run main.go 运行项目,最后在浏览器上访问 http://127.0.0.1:8080/swagger/index.html 即可看到实际效果。

图片图片

接口文档是每个项目都不可或缺的部分,同时也是前后端联调接口的桥梁,它让团队的协作效率得到了显著的提升。SwaggerApi 接口文档只需要在相应代码的位置写上对应的注释,便可以通过工具生成文档,这种方式极大的简化了写接口文档的工作量。通过这次内容的分享相信大家对这个工具都有些许的了解了吧,不过最好是能自己再实践一遍,学习的效果会更好。如果有想要获取完整的代码的朋友,可以在公众号内回复「5148」即可获取到,希望对大家能有所帮助,此外为了方便大家学习再附上相关的官方文档。

  • https://zircote.github.io/swagger-php/
  • https://github.com/swaggo/swag/blob/master/README.md
责任编辑:武晓燕 来源: 码农先森
相关推荐

2024-01-03 15:41:49

2021-09-09 10:23:08

GinNetHttp

2024-02-19 07:40:10

2024-03-05 07:55:41

框架GINGo

2024-07-02 10:40:35

2021-04-16 07:31:50

工具Postman接口

2015-03-02 14:00:54

2009-06-19 16:25:34

Flex与Spring

2021-04-02 08:02:10

Gin集成Casbin开源

2024-12-09 00:00:15

Gin框架中间件

2022-03-07 20:58:08

接口RestJMS

2023-03-08 08:48:50

Swag工具

2023-03-06 08:53:13

2023-11-17 12:11:26

GORMGo Web

2024-09-30 08:10:22

2023-03-10 09:41:16

NAPI框架鸿蒙

2020-12-24 10:20:43

文档工具语言

2017-07-20 17:05:04

JavaScriptswagger-decSwagger

2024-01-30 12:08:31

Go框架停止服务

2024-11-25 08:14:09

Gin框架格式
点赞
收藏

51CTO技术栈公众号