Go Swagger 教程:如何使用 go-swagger 创建 Golang API 文档

言鼎科技 2023-07-03 198

作为一名开发人员,您可能了解记录和组织所有 API 的重要性,并且您也知道并非每个开发人员都喜欢这个文档部分。为此,我们需要一些可以轻松用于准备 API 文档的工具。好吧,第一个出现的工具是 Swagger。

什么是招摇?

Swagger 是一组用于编写基于 REST 的 API 的开源工具。它简化了编写 API 的过程,指定标准并提供编写和组织可扩展 API 所需的工具。

为什么要使用招摇?

如前所述,当我们必须遵循方法论时,文档是“必须的”。使用 swagger,我们可以通过在代码中添加注释来创建 API 文档。

现在问题可能会出现Swagger 只是用于 API 文档吗?不,这不对。

借助 Swagger,我们可以为任何技术(如 Node、AngularJS、PHP 等)生成客户端。因此,它有利于我们应用程序的命名约定、维护最佳实践和通用结构。此外,它确实节省了客户端的编码时间。

现在,让我们看看我们将在本教程中做什么。

准备好用创新技术彻底改变您的行业了吗?
联系像 Bacancy 这样经验丰富的Golang 开发公司来创建时尚、高性能的应用程序,让您的竞争对手望尘莫及。

教程目标:使用 Go Swagger 的 Golang API 文档

在本教程中,我们将使用Go swagger制作一个演示应用程序并准备 API 文档。观看下面的视频,了解我们将在本教程中构建的内容。

Go Swagger 示例:如何创建 Golang API 文档

事不宜迟,让我们开始编码部分。以下是创建 Golang API 文档的分步说明。

创建项目目录

使用以下命令创建项目目录。


mkdir goswaggerCD 飘飘然去 mod 初始化 goswagger

安装招摇


下载_url=$(curl -s https://api.github.com/repos/go-swagger/go-swagger/releases/latest | \
 jq -r '.资产[] | 选择(.name | 包含("'"$(uname | tr '[:upper:]' '[:lower:]')"'_amd64")) | .browser_download_url')curl -o /usr/local/bin/swagger -L'#' "$download_url"chmod +x /usr/local/bin/swagger

下载依赖

接下来,我们将下载所需的依赖项
对于这个演示,我们将使用:

  • Mux:处理http请求和路由

命令:


去获取 github.com/gorilla/mux
  • Swagger:处理 swagger 文档

命令:


去获取 github.com/go-openapi/runtime/middleware
  • MySQL:处理 MySQL 查询

命令:


github.com/go-sql-driver/mysql去获取 github.com/jmoiron/sqlx

从根目录导入数据库 company.sql

在根目录下创建main.go。建立数据库连接、API 路由和 Swagger 文档。


   r := mux.NewRouter()
  dbsqlx := 配置.ConnectDBSqlx()
  hsqlx := 控制器.NewBaseHandlerSqlx(dbsqlx)

  公司 := r.PathPrefix("/admin/company").Subrouter()
  company.HandleFunc("/", hsqlx.PostCompanySqlx).Methods("POST")
  公司.HandleFunc("/", hsqlx.GetCompaniesSqlx).Methods("GET")
  company.HandleFunc("/{id}", hsqlx.EditCompany).Methods("PUT")
  company.HandleFunc("/{id}", hsqlx.DeleteCompany).Methods("DELETE")

使用 Go Swagger 编写文档

现在,让我们看看如何使用 Swagger 进行文档化。它将由基本配置、模型和 API 路由组成。

基本配置


// 公司 API://版本:0.0.1// 标题:Company Api// 方案:http, https// 主机:localhost:5000// 基本路径:/// 产生:// - 应用程序/json//// 安全定义:// 接口密钥:// 类型:apiKey// 在:标题// 名称:授权//招摇:元包控制器

对于安全定义,我们可以使用 API 密钥,它可以为每个 API 进行验证。

楷模

为我们的 API 的请求和响应创建模型。下面是一些带有 swagger 注释的结构示例。我们可以为每个字段添加名称、类型、模式、必需和描述。


类型 ReqAddCompany 结构 {
  // 公司名称
  // 输入:字符串
  名称字符串 `json:"name"validate:"required,min=2,max=100,alpha_space"`
  // 公司状况
  // 输入:int64
  Status int64 `json:"status" validate:"required"`}// swagger:parameters admin addCompany类型 ReqCompanyBody 结构 {
  // - 名称:正文
  // 在:主体
  // 描述:名称和状态
  // 模式:
  // 类型:对象
  // "$ref": "#/definitions/ReqAddCompany"
  // 必需:真
  正文 ReqAddCompany `json:"body"`}// swagger:模型公司类型公司结构{
  //公司ID
  // 输入:int64
  ID int64 `json:"id"`
  // 公司名称
  // 输入:字符串
  名称字符串 `json:"name"`
  // 公司状况
  // 输入:int64
  状态 int64 `json:"status"`}// swagger:model CommonError类型 CommonError 结构 {
  // 错误状态
  // 输入:int64
  状态 int64 `json:"status"`
  // 错误信息
  // 输入:字符串
  消息字符串 `json:"message"`}

API路由

我们可以为每条路线添加 swagger 注释。如果需要,我们可以在其中指定请求和响应模型、路由名称、请求方法、描述和 API 密钥。


// swagger:route GET /admin/company/ admin listCompany// 获取公司列表//// 安全:// - api密钥:[]// 响应:// 401: 常见错误// 200: 获取公司func (h *BaseHandlerSqlx) GetCompaniesSqlx(w http.ResponseWriter, r *http.Request) {
  响应:= GetCompanies{}
  公司 := models.GetCompaniesSqlx(h.db)

  响应.Status = 1
  response.Message = lang.Get("成功")
  response.Data = 公司

  w.Header().Set("内容类型", "application/json")
  json.NewEncoder(w).编码(响应)}
// swagger:route POST /admin/company/ admin addCompany//创建一个新公司//// 安全:// - api密钥:[]// 响应:// 401: 常见错误// 200: 获取公司func (h *BaseHandlerSqlx) PostCompanySqlx(w http.ResponseWriter, r *http.Request) {
  w.Header().Set("内容类型", "application/json")
  响应:=获取公司{}

  解码器:= json.NewDecoder(r.Body)
  var reqcompany *models.ReqCompany
  错误 := decoder.Decode(&reqcompany)
  fmt.Println(错误)

  如果错误!=无{
      json.NewEncoder(w).Encode(ErrHandler(lang.Get("invalid_request")))
      返回
  }

  公司,errmessage := models.PostCompanySqlx(h.db, reqcompany)
  如果错误消息!=“”{
      json.NewEncoder(w).Encode(ErrHandler(错误消息))
      返回
  }

  响应.Status = 1
  response.Message = lang.Get("插入成功")
  response.Data = 公司
  json.NewEncoder(w).编码(响应)}
// swagger:route PUT /admin/company/{id} admin editCompany// 编辑公司//// 消费:// - 应用程序/x-www-form-urlencoded// 安全:// - api密钥:[]// 响应:// 401: 常见错误// 200: 获取公司func (h *BaseHandlerSqlx) EditCompany(w http.ResponseWriter, r *http.Request) {
  r.ParseForm()

  w.Header().Set("内容类型", "application/json")
  变量 := mux.Vars(r)
  响应:=获取公司{}
  id, 错误 := strconv.ParseInt(vars["id"], 10, 64)
  如果错误!=无{
      json.NewEncoder(w).Encode(ErrHandler(lang.Get("invalid_request")))
      返回
  }

  var reqcompany 模型.ReqCompany
  reqcompany.Status, err = strconv.ParseInt(r.FormValue("状态"), 10, 64)
  reqcompany.Name = r.FormValue("名称")

  如果错误!=无{
      json.NewEncoder(w).Encode(ErrHandler(lang.Get("invalid_request")))
      返回
  }

  公司,errmessage := models.EditCompany(h.db, &reqcompany, id)
  如果错误消息!=“”{
      json.NewEncoder(w).Encode(ErrHandler(错误消息))
      返回
  }

  响应.Status = 1
  response.Message = lang.Get("更新成功")
  response.Data = 公司
  json.NewEncoder(w).编码(响应)}
// swagger:route DELETE /admin/company/{id} admin deleteCompany// 删除公司//// 安全:// - api密钥:[]// 响应:// 401: 常见错误// 200: 共同成功// 创建句柄删除获取公司func (h *BaseHandlerSqlx) DeleteCompany(w http.ResponseWriter, r *http.Request) {
  变量 := mux.Vars(r)

  errmessage := models.DeleteCompany(h.db, vars["id"])

  如果错误消息!=“”{
      json.NewEncoder(w).Encode(ErrHandler(错误消息))
      返回
  }

  成功响应:= CommonSuccess{}
  成功响应.Status = 1
  successresponse.Message = lang.Get("delete_success")

  w.Header().Set("内容类型", "application/json")
  json.NewEncoder(w).Encode(成功响应)}

完成 api 后,我们可以在根目录中使用以下命令从 swagger 注释生成 swagger yamlJSON文件。

swagger generate spec -o ./swagger.yaml –scan-models会在根目录下
生成一个swagger.yaml文件。我们也可以用同样的方式创建一个JSON文件。

使用这个文件,我们可以在main.go文件中添加文档的路由。


   // 开发者文档
  opts := middleware.SwaggerUIOpts{SpecURL: "/swagger.yaml"}
  sh := middleware.SwaggerUI(opts, nil)
  r.Handle("/文档", sh)

  // 共享文档
  // opts1 := middleware.RedocOpts{SpecURL: "/swagger.yaml"}
  // sh1 := middleware.Redoc(opts1, nil)
  // r.Handle("/docs", sh1)

完成这些步骤后,开发人员文档将类似于下图。

Go Swagger 教程:如何使用 go-swagger 创建 Golang API 文档

有关要与外部开发人员共享的只读 API,请参阅以下文档。


使用 Swagger 文档生成客户端

正如上面一开始提到的,Swagger 不仅仅用于 API 文档;它还用于 API 文档。我们还可以使用 Swagger 生成客户端。让我们看看下面的 AngularJS 客户端生成示例。

示例:AngularJS 的客户端生成。


npm 安装 ng-swagger-gen --save-devsudo node_modules/.bin/ng-swagger-gen -i ../swagger.yaml -o 后端/src/app

它将为要包含在 Swagger 文档中的所有 API 创建服务文件。同样,您可以为其他框架和技术生成客户端。

所以,这是关于使用 go-swagger 创建 Golang API 文档。如需完整文档,请随时访问 github 存储库:go-swagger-example

结论

我希望Go Swagger教程对您有所帮助,并消除了您对 Golang API 的 Swagger 文档的疑虑。如果您是 Golang 爱好者,请访问Golang 教程页面以获取更多此类教程并开始每天学习更多内容!如果您有任何问题,请随时发表评论并联系。

有时,许多需求需要熟练、知识渊博且敬业的开发人员来完成他们的 Golang 项目。对于此类要求,建议联系并聘请熟练的开发人员。您也在为您的项目寻找这样的开发人员吗?如果是,那为什么要浪费时间?立即联系 Bacancy 以聘请具有基础和高级 Golang 知识的Golang 开发人员。

言鼎科技

The End