1. 程式人生 > 實用技巧 >如何利用go-zero在Go中快速實現JWT認證

如何利用go-zero在Go中快速實現JWT認證

一、什麼是Swagger

隨著技術的不斷方法,現在的網站開發基本都是使用前後端分離的模式,這樣使前端開發者和後端開發者只需要專注自己擅長的即可。但這種方式會存在一種問題:前後端通過API介面的方式進行呼叫,介面文件的好壞可以決定開發的進度。以前如果使用Word的形式提供介面文件,或多或少的都會存在各種問題。前端抱怨說後端給的介面文件與實際情況不一致。而後端開發人員又覺得編寫以及維護介面文件很費精力,文件經常不能及時更新,導致前端看到的還是舊的介面文件。這時候就需要使用Swagger了。

那麼什麼是Swagger呢?Swagger是最流行的API開發工具,它遵循了OpenAPI規範,可以根據API介面自動生成線上文件,這樣就可以解決文件更新不及時的問題。它可以貫穿於整個API生態,比如API的設計、編寫API文件等。而且Swagger還是一種通用的、與具體程式語言無關的API描述規範。

有關更多Swagger的介紹,可以參考Swagger官網,官網地址:https://swagger.io/

二、ASP.NET Core中使用Swagger

這裡使用最新的ASP.NET Core 3.1建立WebAPI介面。關於如何建立WebAPI這裡不在描述。建立後的WebAPI專案結構如下:

1、新增Swagger

直接在NuGet裡面搜尋Swashbuckle.AspNetCore包進行安裝:

2、新增服務

在Startup類的ConfigureServices方法裡面注入服務:

public void ConfigureServices(IServiceCollection services)
{
    // 新增Swagger
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "API Demo", Version = "v1" });
    });
    services.AddControllers();
}

3、新增中介軟體

在Startup類的Configure方法裡面新增Swagger有關的中介軟體:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 新增Swagger有關中介軟體
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "API Demo v1");
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

4、新增控制器

新建一個控制器,裡面包括基礎的增刪改查方法:

using Microsoft.AspNetCore.Mvc;

namespace SwaggerDemo.Controllers
{
    [Route("api/student")]
    [ApiController]
    public class StudentController : ControllerBase
    {
        [HttpGet]
        public string Get()
        {
            return "Tom";
        }

        [HttpPost]
        public void Post()
        {
            
        }

        [HttpPut]
        public void Put()
        {

        }

        [HttpDelete]
        public void Delete()
        {

        }
    }
}

執行程式,修改一下url地址:

http://localhost:5000/swagger/index.html

如下圖所示:

這樣就可以看到介面了。但這樣還不是我們最終想要的結果,我們想知道每個方法的註釋和方法引數的註釋,這就需要對介面做XML註釋了。首先安裝Microsoft.Extensions.PlatformAbstractions包:

然後修改ConfigureServices方法,增加下面的方法:

public void ConfigureServices(IServiceCollection services)
{
    #region 新增Swagger
    services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1",new  OpenApiInfo { Title = "My API", Version = "v1" });
        // 獲取xml檔名
        var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
        // 獲取xml檔案路徑
        var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
        // 新增控制器層註釋,true表示顯示控制器註釋
        options.IncludeXmlComments(xmlPath, true);
    });
    #endregion
    services.AddControllers();
}

然後給新建的介面添加註釋:

using Microsoft.AspNetCore.Mvc;

namespace SwaggerDemo.Controllers
{

    /// <summary>
    /// 學生控制器
    /// </summary>
    [Route("api/student")]
    [ApiController]
    public class StudentController : ControllerBase
    {
        /// <summary>
        /// 獲取所有學生
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            return "Tom";
        }

        /// <summary>
        /// 新增學生
        /// </summary>
        [HttpPost]
        public void Post()
        {
            
        }

        /// <summary>
        /// 修改學生資訊
        /// </summary>
        [HttpPut]
        public void Put()
        {

        }

        /// <summary>
        /// 刪除學生資訊
        /// </summary>
        [HttpDelete]
        public void Delete()
        {

        }
    }
}

專案右鍵,選擇屬性,勾選“XML文件檔案”,如下圖所示:

在執行程式:

可以看到,剛才在控制器上面新增的註釋資訊都顯示出來了。這樣前端就可以直接檢視介面文件了。

Swagger除了可以顯示介面註釋以外,還可以進行除錯,以前除錯都是使用Postman,我們也可以直接使用Swagger進行除錯。新新增一個Student類:

namespace SwaggerDemo
{
    public class Student
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }
}

然後新建一個集合,裡面新增一些Student的資料,模擬資料庫操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace SwaggerDemo
{
    public class DataHelper
    {
        public static List<Student> ListStudent = new List<Student>();

        public static List<Student> GetStudent()
        {
            for (int i = 0; i < 5; i++)
            {
                Student student = new Student();
                student.ID = i;
                student.Name = $"測試_{i}";
                student.Age = 20 + i;
                ListStudent.Add(student);
            }

            return ListStudent;
        }
    }
}

然後修改Student控制器:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace SwaggerDemo.Controllers
{

    /// <summary>
    /// 學生控制器
    /// </summary>
    [Route("api/student")]
    [ApiController]
    public class StudentController : ControllerBase
    {
        /// <summary>
        /// 獲取所有學生
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public List<Student> Get()
        {
            return DataHelper.GetStudent();
        }

        /// <summary>
        /// 新增學生
        /// </summary>
        /// <param name="entity">學生實體</param>
        /// <returns></returns>
        [HttpPost]
        public List<Student> Post(Student entity)
        {
            DataHelper.ListStudent.Add(entity);
            return DataHelper.ListStudent;
        }

        /// <summary>
        /// 修改學生資訊
        /// </summary>
        /// <param name="entity">學生實體</param>
        /// <returns></returns>
        [HttpPut]
        public List<Student> Put(Student entity)
        {
            for (int i = 0; i < DataHelper.ListStudent.Count; i++)
            {
                if (DataHelper.ListStudent[i].ID == entity.ID)
                {
                    DataHelper.ListStudent[i].Name = entity.Name;
                    DataHelper.ListStudent[i].Age = entity.Age;
                    break;
                }
            }
            return DataHelper.ListStudent;
        }

        /// <summary>
        /// 刪除學生資訊
        /// </summary>
        /// <param name="id">學生Id</param>
        /// <returns></returns>
        [HttpDelete]
        public List<Student> Delete(int id)
        {
            for (int i = 0; i < DataHelper.ListStudent.Count; i++)
            {
                if(DataHelper.ListStudent[i].ID == id)
                {
                    DataHelper.ListStudent.Remove(DataHelper.ListStudent[i]);
                    break;
                }
            }
            return DataHelper.ListStudent;
        }
    }
}

執行程式:

這時候是不能輸入的,只能檢視,點選右上角的“Try it out”:

這時會變成Cancel,點選Cancel會回到Try it out:

我們點選Execute執行:

下面會列出執行結果:

這樣就完成了GET方法的除錯。這是無引數方法的除錯,如果有引數的方法怎麼除錯呢?我們以POT方法為例。我們點開POST方法:

然後點選“Tty it out”,可以變成輸入狀態,輸入引數,點選“Execute”按鈕執行:

最後在下面就會輸出結果:

PUT和DELETE可以使用同樣的方式進行測試。

三、總結

上面簡單介紹了什麼是Swagger,以及如何利用Swagger進行除錯,這樣只需要啟動程式即可,不需要在額外的使用Postman進行測試。使用Swagger可以保持介面文件能夠及時更新。