第一部分:技术栈概述

1. Go语言简介

Go(又称Golang)是Google开发的一门静态类型、编译型编程语言,具有以下特点:

  • 高性能:编译为机器码,执行效率接近C/C++

  • 简洁语法:没有复杂的OOP概念,学习曲线平缓

  • 原生并发:goroutine和channel实现高效并发

  • 强大标准库:内置HTTP、JSON、加密等常用功能

  • 跨平台:可编译为Windows、Linux、macOS等平台的可执行文件

2. Gin框架介绍

Gin是一个用Go编写的高性能HTTP Web框架:

  • 极速路由:基于httprouter,路由匹配速度极快

  • 中间件支持:方便扩展认证、日志等功能

  • JSON友好:内置高效JSON处理

  • 适合API开发:轻量级设计,专注于HTTP服务

3. 开发工具链

  • VSCode:轻量级代码编辑器,配合Go插件提供智能提示

  • Apifox:API调试工具,可替代Postman,支持:

    • 接口测试

    • 文档生成

    • Mock数据

    • 团队协作

第二部分:项目构建

1.创建项目

mkdir gin-api-demo
cd gin-api-demo
go mod init gin-api-demo 
//是一个 Go 语言的模块初始化命令,用于创建一个新的 Go 模块(module)。这个命令会生成一个 go.mod 文件,该文件用于管理项目的依赖关系。go get -u github.com/gin-gonic/gin 
//用于下载并安装 Gin 框架,-u 表示 "update"(更新),如果当前目录有 go.mod 文件,会自动添加 Gin 作为依赖项,并记录版本号,同时生成/更新 go.sum 文件,记录依赖包的哈希校验值(确保安全性)go mod tidy
//Go 模块(module)管理中的一个重要命令,用于整理和优化项目的依赖关系
//添加缺失的依赖,移除未使用的依赖,同步依赖版本

2.创建main.go文件

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 定义路由r.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello, Gin!",})})// 启动服务器(默认 8080 端口)r.Run()
}

3.运行

go run main.go

浏览器访问 http://localhost:8080

第三部分:用户管理API

1.定义用户结构体

在 main.go 中添加:

type User struct {ID   string `json:"id"`Name string `json:"name"`Age  int    `json:"age"`
}var users = []User{{ID: "1", Name: "张三", Age: 20},{ID: "2", Name: "李四", Age: 25},
}

2.获取所有用户(GET/users)

r.GET("/users", func(c *gin.Context) {c.JSON(http.StatusOK, users)
})

3.创建用户(POST/users)

r.POST("/users", func(c *gin.Context) {var newUser Userif err := c.ShouldBindJSON(&newUser); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}users = append(users, newUser)c.JSON(http.StatusCreated, newUser)
})

4.获取单个用户(GET /users/:id

r.GET("/users/:id", func(c *gin.Context) {id := c.Param("id")for _, user := range users {if user.ID == id {c.JSON(http.StatusOK, user)return}}c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
})

5.完整代码

package mainimport ("net/http""github.com/gin-gonic/gin"
)type User struct {ID   string `json:"id"`Name string `json:"name"`Age  int    `json:"age"`
}var users = []User{{ID: "1", Name: "张三", Age: 20},{ID: "2", Name: "李四", Age: 25},
}func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello, Gin!",})})r.GET("/users", func(c *gin.Context) {c.JSON(http.StatusOK, users)})r.POST("/users", func(c *gin.Context) {var newUser Userif err := c.ShouldBindJSON(&newUser); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}users = append(users, newUser)c.JSON(http.StatusCreated, newUser)})r.GET("/users/:id", func(c *gin.Context) {id := c.Param("id")for _, user := range users {if user.ID == id {c.JSON(http.StatusOK, user)return}}c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})})r.Run()
}

第四部分:使用 Apifox 测试 API

1.启动服务

go run main.go

2.在 Apifox 中测试

  1. 新建项目 → 新建接口

  2. 测试 GET /users

    • 方法: GET

    • URL: http://localhost:8080/users

    • 点击 发送,应该返回用户列表

3.测试 POST /users

  • 方法: POST

  • URL: http://localhost:8080/users

  • Body (JSON):

{"id": "3","name": "王五","age": 30
}
  • 点击 发送,应该返回创建的用户

可以看到状态码响应不对,可以进行修改

4.测试 GET /users/:id

  • 方法: GET

  • URL: http://localhost:8080/users/1

  • 点击 发送,应该返回 ID 为 1 的用户

第五部分:生成Swagger 文档导入 Apifox

1.安装 Swagger 工具

//安装 swag 命令行工具
go install github.com/swaggo/swag/cmd/swag@latest
//验证安装
swag --version  # 应输出版本号(如 v1.16.3)
//安装 Gin 的 Swagger 依赖
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

2.为代码添加 Swagger 注释

(1) 在 main.go 顶部添加全局注释
// @title          用户管理 API(Swagger 版)
// @version        1.0
// @description    这是一个使用 Gin 和 Swagger 实现的用户管理 API
// @host      localhost:8080
// @BasePath  /
func main() {r := gin.Default()// ...(原有代码)
}(2) 为每个路由添加注释
示例 1:GET /users(获取所有用户)
// GetUsers 获取所有用户
// @Summary      获取用户列表
// @Description  返回所有用户数据
// @Tags         users
// @Accept       json
// @Produce      json
// @Success      200  {array}   User
// @Router       /users [get]
func GetUsers(c *gin.Context) {c.JSON(http.StatusOK, users)
}
示例 2:POST /users(创建用户)
// CreateUser 创建用户
// @Summary      创建新用户
// @Description  接收 JSON 数据并创建用户
// @Tags         users
// @Accept       json
// @Produce      json
// @Param        user  body      User  true  "用户信息"
// @Success      201  {object}  User
// @Failure      400  {object}  map[string]string
// @Router       /users [post]
func CreateUser(c *gin.Context) {var newUser Userif err := c.ShouldBindJSON(&newUser); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}users = append(users, newUser)c.JSON(http.StatusCreated, newUser)
}
示例 3:GET /users/:id(获取单个用户)
// GetUserByID 获取单个用户
// @Summary      根据ID获取用户
// @Description  返回指定ID的用户数据
// @Tags         users
// @Accept       json
// @Produce      json
// @Param        id   path      string  true  "用户ID"
// @Success      200  {object}  User
// @Failure      404  {object}  map[string]string
// @Router       /users/{id} [get]
func GetUserByID(c *gin.Context) {id := c.Param("id")for _, user := range users {if user.ID == id {c.JSON(http.StatusOK, user)return}}c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
}

3.生成 Swagger 文档

//(1) 运行 swag init
swag init
//生成文件:
docs/
├── docs.go       # Go 代码
├── swagger.json  # Swagger 文档(JSON 格式)
└── swagger.yaml  # Swagger 文档(YAML 格式)//(2) 导入 docs 包到 main.go
import (swaggerFiles "github.com/swaggo/files"     // Swagger UI 静态文件ginSwagger "github.com/swaggo/gin-swagger" // Gin 的 Swagger 中间件_ "github.com/gin-api-demo/docs"替换为你的模块名(和 go.mod 一致)// ...其他导入
)//(3)打开项目根目录的 go.mod 文件,第一行应类似:
module github.com/你的用户名/gin-api-demo  (没有用户名就不写)//(4) 添加 Swagger UI 路由
func main() {r := gin.Default()r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))// ...(其他路由)r.Run()
}//最后来一下go mod tidy   养成好习惯

4.运行并访问 Swagger UI

//(1) 启动服务器
go run main.go
//(2) 访问 Swagger UI
http://localhost:8080/swagger/index.html

 5.导入 Swagger 到 Apifox

(1) 导出 swagger.json

文件路径:docs/swagger.json

(2) 在 Apifox 中导入

  1. 打开 Apifox → 项目 → 导入 → 选择 swagger.json

  2. 点击 确定,Apifox 会自动解析所有接口。

(3) 在 Apifox 中测试

  • 查看自动生成的接口文档。

  • 直接发送请求测试(无需手动配置参数)。

总结:swagger文档和apifox搭配可以更加方便导入项目的接口。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 容器技术入门与环境部署

一、Docker 技术概述与核心概念解析 (一)Docker 技术本质与定位 Docker 是当前主流的操作系统级容器虚拟化技术,其核心价值在于通过轻量化隔离机制解决开发、测试与生产环境的一致性问题。与传统虚拟机(如 VMware)相…

π0源码(openpi)剖析——从π0模型架构的实现:如何基于PaLI-Gemma和扩散策略去噪生成动作,到基于C/S架构下的模型训练与部署

前言 ChatGPT出来后的两年多,也是我疯狂写博的两年多(年初deepseek更引爆了下),比如从创业起步时的15年到后来22年之间 每年2-6篇的,干到了23年30篇、24年65篇、25年前两月18篇,成了我在大模型和具身的原始技术积累 如今一转眼已…

Vui:轻量级语音对话模型整合包,让交互更自然

Vui:轻量级语音对话模型,让交互更自然 🗣️✨ Vui 是 Fluxions-AI 团队推出的一款开源轻量级语音对话模型,其核心架构基于 LLaMA。这款模型经过了长达 4 万小时的真实对话数据训练,能够逼真地模拟人类对话中的语气词、…

【STL】深入理解 string 的底层思想

一、STL的定义 STL是C标准库的一部分它不仅是一个可复用的组件库还是一个包含数据结构和算法的软件框架。 二、STL的历史和版本 原始版本: Alexander Stepanov、Meng Lee在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运…

深入剖析Linux epoll模型:从LT/ET模式到EPOLLONESHOT的实战指南

一、epoll:高性能I/O复用的核心引擎 epoll是Linux内核2.6引入的高效I/O多路复用机制,专为解决C10K问题而生。相比select/poll,epoll在连接数激增时性能优势显著: // 创建epoll实例 int epollfd epoll_create1(0);// 事件注册 s…

网络安全之某cms的漏洞分析

漏洞描述 该漏洞源于Appcenter.php存在限制,但攻击者仍然可以通过绕过这些限制并以某种方式编写代码,使得经过身份验证的攻击者可以利用该漏洞执行任意命令 漏洞分析 绕过编辑模板限制,从而实现RCE 这里可以修改模板文件,但是不…

Nginx-前端跨域解决方案!

1 Nginx 核心 Nginx 是一个开源的高性能 HTTP 和反向代理服务器,以轻量级、高并发处理能力和低资源消耗著称。除作为 Web 服务器外,还可充当邮件代理服务器和通用的 TCP/UDP 代理服务器,广泛应用于现代 Web 架构中。 在 Windows 系统中使用…

RedisVL 入门构建高效的 AI 向量搜索应用

一、前置条件 在开始之前,请确保: 已在 Python 环境中安装 redisvl。运行 Redis Stack 或 Redis Cloud 实例。 二、定义索引架构(IndexSchema) 索引架构(IndexSchema)用于定义 Redis 的索引配置和字段信…

基于ssm移动学习平台微信小程序源码数据库文档

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…

【Python】Tkinter模块(巨详细)

专栏文章索引:Python 有问题可私聊:QQ:3375119339 本文内容系本人根据阅读的《Python GUI设计tkinter从入门到实践》所得,以自己的方式进行总结和表达。未经授权,禁止在任何平台上以任何形式复制或发布原始书籍的内容。如有侵权,请联系我删除。 目录 一、Tkinter与GUI …

【C++特殊工具与技术】局部类

在 C 的类体系中,除了全局类、嵌套类(在类内部定义的类),还有一种特殊的存在 ——局部类(Local Class)。它像函数内部的 “封闭王国”,作用域严格限制在所属函数内,既拥有类的封装特…

《C#图解教程 第5版》深度推荐

《C#图解教程 第5版》深度推荐 在 C# 编程语言的浩瀚学习资源中,《C#图解教程 第5版》宛如一座灯塔,为开发者照亮前行之路。通过其详实的目录,我们能清晰窥见这本书在知识架构、学习引导上的匠心独运,无论是编程新手还是进阶开发者…

【Kubernetes】配置自定义的 kube-scheduler 调度规则

在最近一次 K8s 环境的维护中,发现多个 Pod 使用相同镜像时,调度到固定节点的问题导致集群节点资源分配不均的情况。 启用调度器的打分日志后发现这一现象是由 ImageLocality 打分策略所引起的(所有的节点中,只有一个节点有运行该…

跟着AI学习C# Day21

📅 Day 21:动态类型与动态语言运行时(Dynamic Types & DLR) ✅ 学习目标: 理解什么是 dynamic 类型;掌握 dynamic 与 object 的区别;理解 DLR(Dynamic Language Runtime&#…

leetcode-3085.成为K字符串需要删除的最小字符串数

题目描述 解题思路 这题不难想到需要统计每个字母的出现频率,一共有26个字母,故cnt数组有26维。我们可以枚举其中一种作为「删除操作结束后出现频率最低的字符」,将其设置为 c,那么所有频率小于 c 的字符都会被删除,所…

Android 中 解析 XML 文件的几种方式

在 Android 开发中,解析 XML 文件有多种方式,每种方式都有其特点和适用场景。常见的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 一、xml 文件及数据类 1、xml 文件 将测试用 book.xml 文件放在项目的 app/src/main/assets 目录下,文件内容如下:<lib…

python里的abc库是什么东西

Python 中的 ABC&#xff1a;为什么你需要抽象基类&#xff1f;告别“假鸭子”&#xff0c;拥抱真抽象&#xff01; 你是不是经常在 Python 项目中感到困惑&#xff1a;我定义了一个类&#xff0c;希望它能被其他类继承并实现某些特定功能&#xff0c;但又不想它被直接实例化&…

设计模式精讲 Day 9:装饰器模式(Decorator Pattern)

【设计模式精讲 Day 9】装饰器模式&#xff08;Decorator Pattern&#xff09; 文章内容 在软件开发中&#xff0c;灵活扩展功能是提升系统可维护性和可复用性的关键。装饰器模式作为一种结构型设计模式&#xff0c;为对象动态地添加职责&#xff0c;而无需通过继承来实现。它…

浏览器无法访问:Nginx下的基于域名的虚拟主机

检查步骤如下&#xff1a; 1、nginx -t &#xff0c;检查配置文件是否有语法错误 [root89 ~]# nginx -t nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx/conf/nginx.conf test is successful # 可以看到 配置…

【appium】6.appium遇到的问题

1.appium-python-client 修改版本1.5 为5.1.1,后执行python程序时&#xff0c;提示&#xff1a; raise TypeError( TypeError: missing 1 required keyword-only argument: options (instance of driver options.Options class) 你遇到的错误&#xff1a; TypeError: missing…