gin框架提高篇(三)

多服务器程序运行

package mainimport ("fmt""github.com/gin-gonic/gin""golang.org/x/sync/errgroup""net/http""time"
)var g errgroup.Group // 使用 errgroup.Group 来并发启动这两个服务器func main() {// 服务器1server01 := &http.Server{Addr:         ":9090", Handler:      router01(),ReadTimeout:  5 * time.Second,WriteTimeout: 10 * time.Second,}// 服务器2server02 := &http.Server{Addr:         ":9092", // 别问为啥不用 91,问就是被占用了Handler:      router02(),ReadTimeout:  5 * time.Second,WriteTimeout: 10 * time.Second,}// 分别启动监听g.Go(func() error {return server01.ListenAndServe()})g.Go(func() error {return server02.ListenAndServe()})// 通过 g.Wait() 来等待它们的执行结果if err := g.Wait(); err != nil {fmt.Println("执行失败", err)}
}func router01() http.Handler {r1 := gin.Default()r1.GET("/MyServer01", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"code": http.StatusOK,"msg":  "服务器程序1启动成功",})})return r1
}func router02() http.Handler {r1 := gin.Default()r1.GET("/MyServer02", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"code": http.StatusOK,"msg":  "服务器程序2启动成功",})})return r1
}

在这里插入图片描述

路由组

package mainimport ("github.com/gin-gonic/gin""net/http"
)type ResGroup struct {Data stringPath string
}func main() {router := gin.Default()// 路由分组1v1 := router.Group("/v1") // /v1{// 路由分组1.1r := v1.Group("/user") // /v1/userr.GET("/login", login) // /v1/user/login// // 路由分组1.1.1r2 := r.Group("showInfo")     // /v1/user/showInfor2.GET("/abstract", abstract) // /v1/user/showInfo/abstractr2.GET("/detail", detail)     // /v1/user/showInfo/detail}// 路由分组2v2 := router.Group("/v2") // v2{v2.GET("/other", other) // /v2/other}router.Run(":9090")
}func other(context *gin.Context) {context.JSON(http.StatusOK, ResGroup{"detail", context.Request.URL.Path})
}func detail(context *gin.Context) {context.JSON(http.StatusOK, ResGroup{"detail", context.Request.URL.Path})
}func abstract(context *gin.Context) {context.JSON(http.StatusOK, ResGroup{"abstract", context.Request.URL.Path})
}func login(context *gin.Context) {context.JSON(http.StatusOK, ResGroup{"login", context.Request.URL.Path})
}

在这里插入图片描述

路由结构

  • v1
    • user
      • login
      • showInfo
        • abstract
        • detail
  • v2
    • other

gin框架 bind

package mainimport ("github.com/gin-gonic/gin""net/http"
)type Login struct {UserName string `json:"user_name" binding:"required"` // 后端字段 UserName → 前端参数 user_name,必需Password string `json:"password" binding:"required"`Remark   string `json:"remark" binding:"required"`
}func main() {r := gin.Default()r.POST("/login", func(context *gin.Context) {var login Loginerr := context.Bind(&login) // 执行绑定,注意参数是地址(引用),绑定的是前端传入的数据if err != nil {context.JSON(http.StatusBadRequest, gin.H{"msg":  "绑定失败,参数错误","data": err.Error(),})return}if login.UserName == "user" && login.Password == "123456" {context.JSON(http.StatusBadRequest, gin.H{"msg":  "登陆成功","data": "OK",})return}context.JSON(http.StatusBadRequest, gin.H{"msg":  "登陆失败","data": "error",})return})r.Run(":9090")
}

在这里插入图片描述

调用 restful 接口

ps:将上一模块的代码打包成exe文件,并执行起来,注意端口冲突问题(命令:go build 文件名)

在这里插入图片描述

  • 逻辑顺序:
    • 客户端(真实) → 服务端
    • 服务端(模拟客户端) →第三方接口
    • 第三方接口→服务端(模拟客户端)
    • 服务端→客户端(真实)
package mainimport ("bytes""encoding/json""fmt""github.com/gin-gonic/gin""io/ioutil""net/http""time"
)// 第三方接口字段
type UserAPI struct {UserName string `json:"user_name"`Password string `json:"password"`Remark   string `json:"remark"`
}// 第三方接口返回字段封装
type TempData struct {Msg  string `json:"msg"`Data string `json:"data"`
}// 客户端请求字段
type ClientRequest struct {UserName string      `json:"user_name"`Password string      `json:"password"`Remark   string      `json:"remark"`Other    interface{} `json:"other"`
}// 服务端返回字段
type ClientResponse struct {Code int         `json:"code"`Msg  string      `json:"msg"`Data interface{} `json:"data"`
}func main() {//testAPI()r := gin.Default()r.POST("/getOtherAPI", getOtherAPI)r.Run(":9092")
}func getOtherAPI(context *gin.Context) {var requestData ClientRequestvar response ClientResponseerr := context.Bind(&requestData) // 绑定请求数据if err != nil {response.Code = http.StatusBadRequestresponse.Msg = "请求的参数错误"response.Data = errcontext.JSON(http.StatusBadRequest, response)return}url := "http://127.0.0.1:9090/login"user := UserAPI{requestData.UserName, requestData.Password, requestData.Remark}data, err := getRestfulAPI(url, user, "application/json")var temp TempDatajson.Unmarshal(data, &temp) // 反序列化response.Code = http.StatusOKresponse.Msg = "请求数据成功"response.Data = tempcontext.JSON(http.StatusOK, response)
}//func testAPI() {
//	url := "http://127.0.0.1:9090/login"
//	user := UserAPI{"user", "123456", "说明"}
//	data, err := getRestfulAPI(url, user, "application/json")
//	fmt.Println(data, err)
//	var temp TempData
//	json.Unmarshal(data, &temp)
//	fmt.Println(temp)
//}func getRestfulAPI(url string, data interface{}, contentType string) ([]byte, error) {client := &http.Client{Timeout: 5 * time.Second}                     // 创建一个http客户端示例,去请求第三方jsonStr, _ := json.Marshal(data)                                     // 序列化数据resp, err := client.Post(url, contentType, bytes.NewBuffer(jsonStr)) // 发起post请求if err != nil {fmt.Println("调用API接口出现了错误")return nil, err}res, err := ioutil.ReadAll(resp.Body)return res, err
}

在这里插入图片描述

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

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

相关文章

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 结构体作为一种数据结构,其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…

HarmonyOS 应用开发之wrapBuilder:封装全局@Builder

全局Builder作为wrapBuilder的参数返回WrappedBuilder对象&#xff0c;实现 全局Builder 可以进行赋值和传递。 说明&#xff1a; 从API version 11开始使用。 接口说明 wrapBuilder是一个模板函数&#xff0c;返回一个WrappedBuilder对象。 declare function wrapBuilder<…

机器学习数据预处理—统计分析方法

数据预处理 1 数据规范化 量纲&#xff0c;指将一个物理导出量用若干基本量的乘方之积表示出来的表达式。数据的比较需要关注两点——绝对数值和量纲&#xff0c;而特征间因为量纲的存在导致无法直接通过绝对数值比较大小&#xff0c;也就无法判断特征间的重要性。例如若某个…

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…

刷题之Leetcode209题(超级详细)

209.长度最小的子数组 力扣题目链接(opens new window)https://leetcode.cn/problems/minimum-size-subarray-sum/ 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条…

数据可视化高级技术Echarts(快速上手柱状图进阶操作)

目录 1.Echarts的配置 2.程序的编码 3.柱状图的实现&#xff08;入门实现&#xff09; 相关属性介绍&#xff08;进阶&#xff09;&#xff1a; 1.标记最大值/最小值 2.标记平均值 3.柱的宽度 4. 横向柱状图 5.colorBy series系列&#xff08;需要构造多组数据才能实现…

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…

C-偶遇行军蚁(遇到过的题,做个笔记)

我的代码: 思路就是把每一行看成一个字符串&#xff0c;然后逐渐增加字符就行 #include <iostream> #include <vector> using namespace std; int main() {string s;int n;cin >> n; //读入行数cin >> s; //读入字符串vector<string>arr(n…

一点点金融

一点点金融 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多趋势分析 改进MACD策略&#xff0c;使用涨跌幅比值RSI计算MACD原始MACD计算改进思路&#xff1a;使用涨跌幅比值RSI计算MACD 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多…

[pyenv] 1. 安装与使用

在看了几个开源的python环境管理器的评论后, 我打算入手 pyenv, 该项目有以下几个优势: 该项目使用纯shell脚本语言实现, 天然亲和linux开发环境.通过设置的PATH环境变量和shims方法隔离的实现方案非常轻量化.子命令引入了compgen补全功能, 对命令输入操作友好.源码开源, 可扩展…

《pytorch深度学习实战》学习笔记第2章

第2章 预训练网络 讨论3种常用的预训练模型&#xff1a; 1、根据内容对图像进行标记&#xff08;识别&#xff09; 2、从真实图像中生成新图像&#xff08;GAN&#xff09; 3、使用正确的英语句子来描述图像内容&#xff08;自然语言&#xff09; 2.1 获取一个预训练好的网络…

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(三)

本篇内容对应 “2.4 生成验证码” 小节 和 “4.7 优化登陆模块”小节 视频链接 1 Kaptcha介绍 Kaotcga是一个生成验证码的工具。 你的网站验证码是什么&#xff1f; 在我们这个牛客论坛项目&#xff0c;验证码分为两部分 给用户看的是图片&#xff0c;用户根据图片上显示的…

什么牌子开放式耳机好用?优选五大高分好物真诚分享

对于习惯长时间佩戴耳机的朋友来说&#xff0c;入耳式耳机固然能够提供较优质的音质体验。但是&#xff0c;由于其较为封闭的设计以及对耳洞的压迫&#xff0c;舒适感较差&#xff0c;长时间佩戴可能会对听力造成一定的影响。因此&#xff0c;开放式耳机的出现为音乐发烧友们提…

Leetcode 684. 冗余连接

心路历程&#xff1a; 这道题属于图论的经典连通问题&#xff0c;这道题翻译过来就是&#xff0c;找到破开图中环的一条边&#xff1b;再翻译过来就是&#xff0c;从后往前遍历edges&#xff0c;依次连接边&#xff0c;当发现新连接的边已经有相同父节点时&#xff08;已经马上…

基于单片机风力发电机迎风面对风向的追踪系统设计

**单片机设计介绍&#xff0c;基于单片机风力发电机迎风面对风向的追踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机风力发电机迎风面对风向的追踪系统设计是一个涉及单片机编程、传感器技术、机械控制等多个领域的综…

java日志框架简介

文章目录 概要常用日志框架常见框架有以下&#xff1a;slf4j StaticLoggerBinder绑定过程&#xff08;slf4j-api-1.7.32 &#xff09;JCL 运行时动态查找过程&#xff1a;&#xff08;commons-logging-1.2&#xff09;使用桥接修改具体日志实现 一行日志的打印过程开源框架日志…

面试算法-153-旋转图像

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,…

Java项目:基于Springboot+vue实现的医院住院管理系统设计与实现(源码+数据库+开题报告+任务书+毕业论文)

一、项目简介 本项目是一套基于Springbootvue实现的医院住院管理系统设 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

基于Springboot+Vue实现前后端分离社团管理系统

一、&#x1f680;选题背景介绍 &#x1f4da;推荐理由&#xff1a; 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于社团管理也是十分常见的。过去使用手工的管理方式对大学生社团进行管理&#xff0c;造成了管理繁琐、难以维护等…

基于java+SpringBoot+Vue的房屋租赁系统设计与实现

基于javaSpringBootVue的房屋租赁系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot JSP工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 房源浏览模块&#xff1a;展示可租赁的房源信息&#xff0c;用户可以根据条件筛选房源。 预约看房模块&#…