Laravel Swagger 使用完整教程

news2024/11/26 1:28:10

Swagger 使用

    • 一、Swagger 基础
      • 1、 什么是Swagger
      • 2、 安装过程
          • 1 、composer安装
          • 2、添加服务提供者,引导框架运行时加载,在 app 配置文件,providers 选项中添加(laravel 5以上忽略此步骤)
          • 3、配置完成后,通过输入命令 **php artisan** 查看已经发现该扩展已经加入 laravel 命令列表
          • 4、生成命令
          • 5、打开 API 文档页面
      • 3、 注解介绍
    • 二、Swagger 实战
        • 1、修改配置
        • 2、使用示例
          • 1、验证提供outh2 或和apikey 两种方式,在存放全局配置中写入(也可以任意目录中)。我是放在了最基础的controller中
          • 2、post请求
          • 3、Get请求
          • 4、Body 为Json 方式
          • 5、文件上传
    • 三、可能遇到的问题
        • 1、线上环境无法正常访问
        • 2、ErrorException : Required @OA\Info() not found

一、Swagger 基础

1、 什么是Swagger

Swagger 是一个基于 Open Api 规范的 API 管理工具,通过项目注解的形式自动构建 API 文档,拥有在线调试的功能。提供了多语言的客户端,laravel 中也有相应的扩展包。

darkaonline/l5-swagger是一款针对 laravel 集成开发的扩展包,可以直接使用 laravel 命令行模式进行操作。
在这里插入图片描述
我是正巧用的是laravel框架,所以选了darkaonline/l5-swagger扩展,而zircote/swagger-php扩展是适用于所有php语言的框架(使用方法可以参考这里,点击前往。这里只介绍darkaonline/l5-swagger扩展的使用

2、 安装过程

这是它的安装环境和依赖:在这里插入图片描述

1 、composer安装
 composer require darkaonline/l5-swagger
2、添加服务提供者,引导框架运行时加载,在 app 配置文件,providers 选项中添加(laravel 5以上忽略此步骤)
 L5Swagger\L5SwaggerServiceProvider::class
3、配置完成后,通过输入命令 php artisan 查看已经发现该扩展已经加入 laravel 命令列表

在这里插入图片描述

4、生成命令

在没有在任何控制器方法中添加注释的时候,不要执行该命令,否则会报致命性错误

php artisan l5-swagger:generate
5、打开 API 文档页面

访问网址: http://yourdomain/api/documentation,就能看到了
在这里插入图片描述

3、 注解介绍

由于 Swagger 是采用注解的形式进行文档生成,需要按照既定的规则去编写注解,这里只提供一些重要的信息

  • 请求
    @OA\Get | @OA\Post:请求类型
    path:请求URI
    tag:归纳相同标签的接口
    summary:接口概要
    description:接口描述
    operationId:接口ID,全局唯一
    @OA\Parameter:接收的参数是来自requestHeader中,即请求头。GET、\POST都适用
    @OA\RequestBody:接收的参数是来自requestBody中,即请求体。主要用来接收前端传递给后端的json字符串中的数据的,所以只能发送POST请求

注意:匹配path中的数值则 in path 查询 in query

    /**
     * @OA\Post(
     *      path="/api/resource/detail/{id}",
     *      operationId="getProjectById",
     *      tags={"Resource相关"},
     *      summary="资源详情",
     *      description="获取资源的详细信息的接口",
     *     security={{"Bearer":{} }},
     *      @OA\Parameter(
     *          name="from",
     *          description="引流的来源",
     *          required=false,
     *          in="query",
     *      ),
     *      @OA\Parameter(
     *          name="id",
     *          description="Resource id",
     *          required=true,
     *          in="path",
     *          @OA\Schema(
     *              type="integer"
     *          )
     *      ),
     * )
     */
  • 响应
    @OA\Response:响应信息
    response:响应的 http 状态码
    description:响应描述
    @OA\MediaType:响应体
    mediaType:返回格式
    @OA\Schema:定义响应体内的数据
    @OA\Property:定义属性字段(id),数据类型(string),字段描述(description)
    @OA\JsonContent:因为现在接口通常采用 json 通讯,所以可以直接定义 json 响应格式
    ref:指定可复用的注解模块,TestApi 为模块ID,全局唯一
    @OA\Schema:可复用注解模块,内部可嵌套 Schema
    /**
     * @OA\Post(
     *      path="/api/resource/list",
     *      tags={"Resource相关"},
     *      summary="资源列表",
     *      description="获取项目列表的接口,调用接口需要传递token令牌",
     *       security={{"Bearer":{} }},
     *      @OA\Parameter(
     *          name="page",
     *          description="页码,默认为1",
     *          required=false,
     *          in="query",
     *      ),
     *      @OA\Parameter(
     *          name="pagesize",
     *          description="每页的数量,默认5条",
     *          required=false,
     *          in="query",
     *      ),
     *
     *     @OA\Response(
     *         response=200,
     *         description="successful",
     *         @OA\MediaType(
     *             mediaType="application/json",
     *             @OA\Schema(
     *                 @OA\Property(property="id", type="integer", description="资源ID"),
     *                 @OA\Property(property="type", type="integer", description="资源类型,1=>病例,2=>文章"),
     *                 @OA\Property(property="title", type="string", description="资源名称"),
     *                 @OA\Property(property="cover", type="string", description="资源封面图"),
     *                 @OA\Property(property="view_count", type="integer", description="浏览量"),
     *                 @OA\Property(property="created_at", type="string", description="发布时间"),
     *             ),
     *         )
     *     ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     * )
     */

在这里插入图片描述

二、Swagger 实战

1、修改配置

根据以上流程,已经安装了扩展,并对注释的使用也有了一定的了解,那就来具体实战吧(本人项目用到了JWT,未用到的可自行跳过)。

  • 如果不想每次修改后都手动执行生成命令,可以通过修改 env 文件,添加配置项
L5_SWAGGER_GENERATE_ALWAYS=true
  • 因为我的token令牌是以Authorization bearer XXXXX传递的,所以要增加securitySchemes,在配置文件l5-swagger.php中,修改如下:
        /*
         * API security definitions. Will be generated into documentation file.
        */
        'securityDefinitions' => [
            'securitySchemes' => [
                'Bearer' => [ // 这是我要用到的Schemes
                    'type' => 'apiKey', // Valid values are "basic", "apiKey" or "oauth2".
                    'description' => 'Enter token in format (Bearer <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".
                ],

                /*
                 * Examples of Security schemes
                */
                /*
                'api_key_security_example' => [ // Unique name of security
                    'type' => 'apiKey', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                    'description' => 'A short description for security scheme',
                    'name' => 'api_key', // 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".
                ],
                'oauth2_security_example' => [ // Unique name of security
                    'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                    'description' => 'A short description for oauth2 security scheme.',
                    'flow' => 'implicit', // The flow used by the OAuth2 security scheme. Valid values are "implicit", "password", "application" or "accessCode".
                    'authorizationUrl' => 'http://example.com/auth', // The authorization URL to be used for (implicit/accessCode)
                    //'tokenUrl' => 'http://example.com/auth' // The authorization URL to be used for (password/application/accessCode)
                    'scopes' => [
                        'read:projects' => 'read your projects',
                        'write:projects' => 'modify projects in your account',
                    ]
                ],
                */

                /* Open API 3.0 support
                'passport' => [ // Unique name of security
                    'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                    'description' => 'Laravel passport oauth2 security.',
                    'in' => 'header',
                    'scheme' => 'https',
                    'flows' => [
                        "password" => [
                            "authorizationUrl" => config('app.url') . '/oauth/authorize',
                            "tokenUrl" => config('app.url') . '/oauth/token',
                            "refreshUrl" => config('app.url') . '/token/refresh',
                            "scopes" => []
                        ],
                    ],
                ],*/

            ],
        ],

2、使用示例

Swagger的使用就是在你的控制器里的方法前面加上注释,示例如下:

<?php
namespace App\Http\Controllers\Api;
class TokenController extends Controller
{

    /**
     * @OA\Post(
     *      path="/api/common/token",
     *      tags={"公共接口"},
     *      summary="token令牌",
     *      description="获取用户token令牌",
     *      @OA\Parameter(
     *          name="type",
     *          description="类型,有token、user两种",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Parameter(
     *          name="user_id",
     *          description="用户唯一标识id",
     *          required=true,
     *          in="query",
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     * )
     */
    public function postToken(){
        //逻辑
        return $this->success(
            [
                'access_token' => $token,
                'token_type' => 'bearer',
            ]);
    }

}

1、验证提供outh2 或和apikey 两种方式,在存放全局配置中写入(也可以任意目录中)。我是放在了最基础的controller中

备注:具体的可以点击这里去了解

<?php

namespace App\Http\Controllers\Api;
use App\Traits\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
/**
 * @SWG\SecurityScheme(
 *     securityDefinition="Bearer",
 *      in="header",
 *      name="Authorization",
 *      type="apiKey",
 * ),
 */
class Controller extends BaseController
{

    public $request;

    public function __construct(Request  $request){

        $this->request = $request;

    }
}

在接口中添加:

security={{"Bearer": {}}},

这时,swagger Ui 会出现一个锁一样的东西,
在这里插入图片描述
在这里,可以输入自己的token,请求的时候会带上token。
当token输入以后点击认证,这时候需要验证token的接口,都会被锁上,就是出现这个锁的样式,如图:
在这里插入图片描述
然后你try 接口的时候,就会带上你刚刚输入的token,这时可以在你的接口中间件中去接收并验证token的有效性了。

2、post请求

备注:配置项security={{“Bearer”:{} }},:该项就是说明该接口需要安全验证,且用到的是Bearer方式

/**
     * @OA\Post(
     *      path="/api/resource/list",
     *      tags={"Resource相关"},
     *      summary="资源列表",
     *      description="获取项目列表的接口,调用接口需要传递token令牌",
     *       security={{"Bearer":{} }},
     *      @OA\Parameter(
     *          name="page",
     *          description="页码,默认为1",
     *          required=false,
     *          in="query",
     *      ),
     *      @OA\Parameter(
     *          name="pagesize",
     *          description="每页的数量,默认5条",
     *          required=false,
     *          in="query",
     *      ),
     *
     *     @OA\Response(
     *         response=200,
     *         description="successful",
     *         @OA\MediaType(
     *             mediaType="application/json",
     *             @OA\Schema(
     *                 @OA\Property(property="id", type="integer", description="资源ID"),
     *                 @OA\Property(property="type", type="integer", description="资源类型,1=>病例,2=>文章"),
     *                 @OA\Property(property="title", type="string", description="资源名称"),
     *                 @OA\Property(property="cover", type="string", description="资源封面图"),
     *                 @OA\Property(property="view_count", type="integer", description="浏览量"),
     *                 @OA\Property(property="created_at", type="string", description="发布时间"),
     *             ),
     *         )
     *     ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     * )
     */
  public function postList(){
        $params = $this->request->all();
        $params['page'] = $params['page'] ?? 1;
        $params['pagesize'] = $params['pagesize'] ?? 5;
        //逻辑
    }

在这里插入图片描述

3、Get请求

/**
 * @OA\Get(
 *      path="/projects/{id}",
 *      operationId="getProjectById",
 *      tags={"Projects"},
 *      summary="Get project information",
 *      description="Returns project data",
 *      @OA\Parameter(
 *          name="id",
 *          description="Project id",
 *          required=true,
 *          in="path",
 *          @OA\Schema(
 *              type="integer"
 *          )
 *      ),
 *      @OA\Response(
 *          response=200,
 *          description="successful operation"
 *       ),
 *      @OA\Response(response=400, description="Bad request"),
 *      @OA\Response(response=404, description="Resource Not Found"),
 *     },
 * )
 */

4、Body 为Json 方式
    /**
     * @OA\Post(summary="统计答题时长",path="/api/behavior/count_answer_time",tags={"行为埋点"},description="统计用户答题时长",
     *     security={{"Bearer":{} }},
     *     @OA\Parameter(name="resource_id",in="query",required=true,description="资源id",
     *         @OA\Schema(
     *              type="integer"
     *          )),
     *     @OA\Parameter(name="log_id",in="query",required=true,description="当下访问记录的唯一标识id",
     *         @OA\Schema(
     *              type="integer"
     *          )),
     *     @OA\RequestBody(
     *         @OA\MediaType(mediaType="application/json",
     *             @OA\Schema(
     *                 @OA\Property(property="ques_id",type="int",description="问题id"),
     *                 @OA\Property(property="type",type="string",description="行为的类型:start和end两种"),
     *                 example={"ques_id": 10, "type": "start"}
     *             )
     *         )
     *     ),
     *     @OA\Response(response="200",description="获取成功"),
     * )
     */
   public function countAnswerTime(){

        info(json_encode($this->request->all()));

        $resource_id = $this->request->get('resource_id');
        $log_id = $this->request->get('log_id');
        $all_params = $this->request->only(['resource_id', 'log_id']);
        $current_type = $this->request->get('type');
        //逻辑
    }

在这里插入图片描述

5、文件上传

备注:这里是支持多文件上传,删除一个就是单文件上传

    /**
     * @OA\Post(summary="上传文件",path="/api/upload/file/{type}",tags={"Upload"},description="上传文件",
     *     security={{"Bearer":{} }},
     *     @OA\Parameter(name="type",in="path",required=true,description="类型"),
     *     @OA\RequestBody(
     *         @OA\MediaType(
     *             mediaType="multipart/form-data",
     *             @OA\Schema(
     *                 @OA\Property(property="file",type="file",description="文件"),
     *                 @OA\Property(property="file2",type="file",description="文件2")
     *             )
     *         )
     *     ),
     *     @OA\Response(response="200",description="获取成功",
     *     @OA\MediaType(mediaType="application/json",
     *             @OA\Schema(
     *                 @OA\Property(property="img_url",description="路径",type="string"),
     *                 @OA\Property(property="original_name",description="原始名称",type="string"),
     *             )
     *         )
     *      )
     * )
     */
    public function postUploadFile($case){
        $file = $this->request->file('file');
         //逻辑
    }

在这里插入图片描述

更多的使用方法可以参考官网例子:https://github.com/zircote/swagger-php/tree/master/Examples/petstore-3.0

三、可能遇到的问题

1、线上环境无法正常访问

可能是你nginx 配置的问题,因为,laravel-swagger 是通过file_content_get() 的方式 echo 输出js 的。而你的nginx 配置判断,如果是 .js 或者css 是静态文件,所以到不了index.php ,更执行不了 file_content_get 函数了。

这时候去掉js的缓存

2、ErrorException : Required @OA\Info() not found

在终端输入命令

php artisan l5-swagger:generate

提示异常:
在这里插入图片描述
这是因为在运行之前,您必须在控制器中至少有一个方法,并带有描述路由的注释

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

/**
 * @OA\Info(title="Swagger使用测试", version="1.0")
 */
class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

然后使用命令php artisan make:controller ProjectsController生成一个控制器,随便写个方法,然后在方法前添加注释即可:

/**
 * @OA\Get(
 *     path="/projects",
 *     @OA\Response(response="200", description="Display a listing of projects.")
 * )
 */
 public function index(){
 }

然后再执行php artisan l5-swagger:generate命令,就正常了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT记事本+登陆界面的简单实现

主体头文件 #ifndef JSB_H #define JSB_H#include <QMainWindow> #include <QMenuBar>//菜单栏 #include <QToolBar>//工具栏 #include <QStatusBar>//状态栏 #include <QTextEdit>//文本 #include <QLabel>//标签 #include <QDebug&g…

什么样的应用程序适合使用Flutter开发桌面?

桌面应用开发的现状 在过去&#xff0c;桌面应用程序的开发通常需要使用特定于操作系统的工具和语言&#xff0c;如C、C#、Java等。这导致了高昂的开发成本和维护困难。尽管有一些跨平台桌面开发工具&#xff0c;如Electron和Qt&#xff0c;但它们在性能、用户体验和开发效率方…

Linus Torvalds接受来自微软的Linux Hyper-V升级

微软最近推送了一些变更&#xff0c;旨在改进即将发布的 Linux 内核 6.6 版本对 Hyper-V 的支持。这些改进包括在 Hyper-V 上支持 AMD SEV-SNP guest 和 Intel TDX guest。除了这两项&#xff0c;还有其他一些升级&#xff0c;如改进了 VMBus 驱动程序中的 ACPI&#xff08;高级…

阿里云产品试用系列-负载均衡 SLB

阿里云负载均衡&#xff08;Server Load Balancer&#xff0c;简称SLB&#xff09;是云原生时代应用高可用的基本要素。通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力&#xff0c;消除单点故障并提升应用系统的可用性。阿里云SLB包含面向4层的网络型负载均衡NLB…

Flink TaskManger 内存计算实战

Flink TaskManager内存计算图 计算实例 案例一、假设Task Process内存4GB。 taskmanager.memory.process.size4096m 先排减JVM内存。 JVM Metaspace 固定内存 256mJVM Overhead 固定比例 process * 0.1 4096 * 0.1 410m 得到 Total Flink Memory 4096-256-410 3430m 计…

Palantir的“英伟达时刻”即将到来

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结 &#xff08;1&#xff09;由于投资者对生成式人工智能的兴趣持续增加&#xff0c;Palantir的股价一直在上涨。 &#xff08;2&#xff09;Palantir已经连续三个季度实现了GAAP盈利&#xff0c;并将很快有资格被纳入标…

接口幂等性最佳实践--redis+注解

文章目录 一、概念二、常见解决方案三、本文实现四、实现思路五、项目简介六、代码实现1.pom2.JedisUtil3.自定义注解ApiIdempotent4.ApiIdempotentInterceptor拦截器5.TokenServiceImpl6.TestApplication 七、测试验证1.获取token的控制器TokenController2.TestController, 注…

Postman应用——Headers请求头设置

文章目录 Header设置Header删除或禁用Header批量编辑Header预设添加 一般在接口需要校验签名时&#xff0c;Headers请求头用来携带签名和生成签名需要的参数&#xff0c;在Postman也可以设置请求头在接口请求时携带参数。 Header设置 说明&#xff1a; Key&#xff1a;Header…

睿趣科技:新手商家如何做好抖音店铺

抖音&#xff0c;作为全球热门的社交媒体平台之一&#xff0c;不仅仅是分享有趣视频的地方&#xff0c;也是许多商家拓展业务的黄金平台。对于新手商家来说&#xff0c;如何在抖音上建立一个成功的店铺是一项重要的任务。以下是一些关于如何做好抖音店铺的建议。 明确你的目标和…

STM32实现PMBus从机程序

最近在野火的STM32F103VET6开发板上实现PMBus从机程序&#xff0c;这个程序参考了以下这篇博客的关于使用中断法实现I2C从机程序&#xff1a;STM32设置为I2C从机模式_iic从机_柒壹漆的博客-CSDN博客 &#xff0c;实测这个程序是可以正常运行的&#xff0c;感谢博主的分享&#…

Flink 类型机制 及 Stream API和Table API类型推断和转换

注&#xff1a;本文使用flink 版本是0.13 一、类型体系 Flink 有两大API &#xff08;1&#xff09;stream API 和 &#xff08;2&#xff09;Table API ,分别对应TypeInformation 和 DataType类型体系。 1.1 TypeInformation系统 TypeInformation系统是使用Stream一定会用…

【Linux】:Kafka组件介绍

目录 环境简介 一、消息 二、主题 三、分区 四、副本 五、生产者 六、消费者 七、消费者组 八、offsets【偏移量】 环境简介 Linux内核&#xff1a;Centos7 Kafka版本&#xff1a;3.5.1 执行命令的目录位置&#xff1a;Kafka安装目录的bin目录下&#xff1a;/usr/loca…

uvm源码解读-sequence,sequencer,driver三者之间的握手关系1

1.start item 1.start_item();sequencer.wait_for_grant(prior);this.pre_do(1);需要指出&#xff0c;这里明确说明了wait_for_grant和send_request之间不能有任何延迟&#xff0c;所以在mid_do这个任务里千万不能有任何延迟。 task uvm_sequencer_base::wait_for_grant(uvm…

MySQL进阶篇2-索引的创建和使用

索引 mkdir mysql tar -xvf mysqlxxxxx.tar -c myql cd mysql rpm -ivh .....rpm yum install openssl-develsystemctl start mysqldgerp temporary password /var/log/mysqld.logmysql -u root -p mysql> show variables like validate_password.% set global validate_…

maven本地安装jar包

在实际开发中&#xff0c;有些jar包不能通过公共库下载&#xff0c;只能本地安装。可以按照以下步骤操作&#xff1a; 1、安装命令&#xff1a; mvn install:install-file -DgroupIdcom.chinacreator.sm -DartifactIdfbm-sm-common -Dversion0.0.1 -Dpackagingjar -Dfile../n…

基于Java+SpringBoot+Vue+协同过滤算法的电影推荐系统(亮点:智能推荐、协同过滤算法、在线支付、视频观看)

协同过滤算法的电影推荐系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实…

微服务学习(七):docker安装Mysql

微服务学习&#xff08;七&#xff09;&#xff1a;docker安装Mysql 1、拉取镜像 docker pull mysql2、查看安装的镜像 docker images3、安装mysql docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置action&#xff0c;包括router事件和message事件&…

Python配置与测试利器:Hydra + pytest的完美结合

简介&#xff1a;Hydra 和 pytest 可以一起使用&#xff0c;基于 Hydra Pytest 的应用可以轻松地管理复杂配置&#xff0c;并编写参数化的单元测试&#xff0c;使得Python开发和测试将变得更为高效。 安装&#xff1a; pip install hydra-core pytest案例源码&#xff1a;my…

系统架构设计师(第二版)学习笔记----软件工程

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----软件工程 文章目录 一、软件工程1.1 软件危机的表现1.2 软件工程的内容 二、软件过程模型2.1 软件的声明周期2.2 瀑布模型2.3 瀑布模型的缺点2.4 原型模型2.5 原型模型开发阶段2.6 开发原型的途径2.7 螺旋…