• Laravel swagger接口文档生成和管理


    Laravel swagger接口文档生成和管理

    接口开发随着时间推移接口会越来越多,随着多部门之间的协作越来越频繁, 维护成本越来越高, 文档的可维护性越来越差, 需要一个工具来管理这些接口的文档, 并能够充当mock server给调用方使用

    这里推荐swagger生成和管理接口文档,下面介绍基于laravel项目的swagger使用

    福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全

    安装swagger

        
        //安装
        composer require darkaonline/l5-swagger
        
    

    laravel >= 5.5

        php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
        php artisan l5-swagger:generate
    

    laravel < 5.5

        php artisan l5-swagger:publish
        php artisan l5-swagger:publish-config
        php artisan l5-swagger:publish-assets
        php artisan l5-swagger:publish-views
        
        php artisan l5-swagger:generate
    

    注意:在运行 php artisan l5-swagger:generate 命令之前,请确保在app目录下存在@OA\Info注解和 且至少定义一个@OA\Get 注解(接口) 否则会异常:

    
    //这是基本信息
    
    /**
     * @OA\Info(
     *      version="1.0.0",
     *      title="L5 OpenApi",
     *      description="L5 Swagger OpenApi description",
     *      @OA\Contact(
     *          email="darius@matulionis.lt"
     *      ),
     *     @OA\License(
     *         name="Apache 2.0",
     *         url="http://www.apache.org/licenses/LICENSE-2.0.html"
     *     )
     * )
     */
     
     //这是get接口
    /**
      * @OA\Get(
      *   path="/api/users/{user_id}",
      *   summary="根据 ID 获取用户信息",
      *   tags={"用户管理"},
      *   @OA\Parameter(
      *     name="user_id",
      *     in="path",
      *     required=true,
      *     description="用户 ID",
      *     @OA\Schema(
      *        type="string"
      *     )
      *   ),
      *   @OA\Response(
      *     response=200,
      *     description="用户对象",
      *     @OA\JsonContent(ref="#/components/schemas/UserModel")
      *   )
      * )
      */
      
      //UserModel定义
      
      /**
     * @OA\Schema(
     *      schema="UserModel",
     *      required={"username", "age"},
     *      @OA\Property(
     *          property="username",
     *          type="string",
     *          description="用户名称"
     *      ),
     *      @OA\Property(
     *          property="age",
     *          type="int",
     *          description="年龄"
     *      )
     * )
     */
    

    全局鉴权:注解

    /**
     * @OA\SecurityScheme(
     *     type="oauth2",
     *     description="这里有多中校验方式:basic|apiKey|oauth2",
     *     name="Password Based",
     *     in="header|query",
     *     scheme="https",
     *     securityScheme="Password Based",
     *     @OA\Flow(
     *         flow="password",
     *         authorizationUrl="/oauth/authorize",
     *         tokenUrl="/oauth/token",
     *         refreshUrl="/oauth/token/refresh",
     *         scopes={}
     *     )
     * )
     */
     
    

    全局鉴权:config配置全局开启(l5-swagger.php)

        'securityDefinitions' => [
            'securitySchemes' => [
                /*
                 * Examples of Security schemes
                */
    
                'Authorization-Bearer' => [ // Unique name of security
                    'type' => 'apiKey',
                    // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                    'description' => '用户登录鉴权Token',
                    'name' => 'authorization',
                    // The name of the header or query parameter to be used.
                    'in' => 'header',
                    // The location of the API key. Valid values are "query" or "header".
                ],
            ]
        ]
    

    鉴权参数

    参数含义
    type类型 “http”, “apiKey”, “oauth2”, “openIdConnect”
    name名称
    in需要API密钥的位置 值为 query、header
    flowOAuth2安全方案使用的流 值为:“implicit”、“password”、“application”或“accesscode”
    authorizationUrlOAuth2授权URL
    scopesOAuth2安全方案的可用范围

    问题

    如果在使用中遇到了Authorize:apiKey header模式情况下,token未通过header进行请求传递的话请参照修复

    修改:/resource/views/vendor/l5-swagger/index.blade.php,主动添加token到头部

      window.ui = ui
    
      ui.getConfigs().requestInterceptor = function (request) {
        if (ui.authSelectors.authorized().size){
          var authObject = ui.authSelectors.authorized()._root.entries[0];
          var securityConfig = authObject[1]._root.entries[1][1]._list._tail.array;
          if (securityConfig[0][1] === 'apiKey' && securityConfig[3][1] === 'header') {
            var token = authObject[1]._root.entries[2][1];
            if (authObject[0] === 'Bearer' && !token.startsWith('Bearer ')){
              token = 'Bearer ' + token;
            }
            request.headers[securityConfig[2][1]] = token;
          }
        }
        request.headers['X-CSRF-TOKEN'] = '{{ csrf_token() }}';
        return request;
      } 
    

    演示

    运行完php artisan l5-swagger:generate 命令后就可以通过浏览器查看接口文档(访问/api/documentation: 当然这个地址可以在l5-swagger.php配置文件中进行修改)

    image.png
    福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全

  • 相关阅读:
    2023-09-09 LeetCode每日一题(课程表)
    浅谈旧项目如何添加新依赖
    android源码设计模式学习笔记(一)
    redis的cluster
    传iPhone 14将全系涨价;TikTok美国用户数据转移到甲骨文,字节无法访问;SeaTunnel 2.1.2发布|极客头条
    河南分销小程序开发|商城小程序开发为什么会火?
    驱动开发:内核封装TDI网络通信接口
    Tableau:详细表达式(LOD表达式)的计算过程
    【Android -- 开发】中级工程师进阶
    哈希表的原理
  • 原文地址:https://blog.csdn.net/nbplus_007/article/details/140037129