go api(get post传参,数据库,redis) 测试

介绍:分别测试get请求,post请求,请求链接数据库,以及redis操作。
1.api代码

package main

import (
	_ "database/sql"
	"encoding/json"
	"github.com/gin-gonic/gin"
	"go-test/com.zs/database"
	"go-test/com.zs/models"
	"go-test/com.zs/repositories"
	"go-test/com.zs/services"
	"go-test/com.zs/utils"
	"log"
	"net/http"
	"strconv"
)

func main() {

	router := gin.Default()

	//reDB, _ := config.ConnRedis()

	log.Println("coming main method ...")
	db, err := database.NewMySQLDB()
	if err != nil {
		log.Fatal(err)
	}

	userRepository := &repositories.UserRepository{
		DB: db,
	}
	userService := &services.UserService{
		UserRepository: userRepository,
	}

	http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			users, err := userService.GetUsers()
			if err != nil {
				utils.ErrorHandler(w, err)
				return
			}
			utils.RespondJSON(w, users, http.StatusOK)

		case http.MethodPost:
			var user models.User
			err := json.NewDecoder(r.Body).Decode(&user)
			if err != nil {
				utils.ErrorHandler(w, err)
				return
			}
			err = userService.CreateUser(&user)
			if err != nil {
				utils.ErrorHandler(w, err)
				return
			}
			utils.RespondJSON(w, user, http.StatusCreated)

		default:
			w.WriteHeader(http.StatusMethodNotAllowed)
			response := models.ErrorResponse{
				Message: "Method not allowed",
			}
			json.NewEncoder(w).Encode(response)
		}
	})

	// http.HandleFunc get 请求拼接参数查询
	//http.HandleFunc("/getUserById", func(w http.ResponseWriter, r *http.Request) {
	//	switch r.Method {
	//	case http.MethodGet:
	//		n, err := strconv.Atoi(r.URL.Query().Get("id"))
	//		user, err := userService.GetUserByID(uint(n))
	//		if err != nil {
	//			utils.ErrorHandler(w, err)
	//			return
	//		}
	//		utils.RespondJSON(w, user, http.StatusOK)
	//
	//	}
	//})

	// router := gin.Default() get请求拼接参数查询
	router.GET("/getUserById", func(c *gin.Context) {
		uid := c.Query("id")
		num, _ := strconv.Atoi(uid)
		user, err := userService.GetUserByID(uint(num))
		if err != nil {
			return
		}
		// 返回字符串
		//c.String(http.StatusOK, "姓名:%s,年龄:%s", user.Name, strconv.Itoa(user.Age))

		// 返回json数据
		c.JSON(http.StatusOK, user)
	})

	// router := gin.Default() post请求拼接参数查询
	router.POST("/postUserById", func(c *gin.Context) {
		//uid := c.PostForm("id") //post请求中 form表单形式
		//num, _ := strconv.Atoi(uid)
		//user, err := userService.GetUserByID(uint(num))
		//if err != nil {
		//	return
		//}
		 返回字符串
		c.String(http.StatusOK, "姓名:%s,年龄:%s", user.Name, strconv.Itoa(user.Age))
		 返回json数据
		//c.JSON(http.StatusOK, user)

		//接收json数据处理方式
		if err := c.ShouldBindJSON(&models.UserJsonReq); err != nil {
			c.JSON(400, gin.H{"error": "无效的JSON格式或参数错误"})
			return
		}

		tId := uint(models.UserJsonReq.ID)
		tName := models.UserJsonReq.Name
		tAge := models.UserJsonReq.Age

		log.Printf("name:%s,age:%s", tName, strconv.Itoa(tAge))

		user, err := userService.GetUserByID(tId)

		if err != nil {
			return
		}

		// 测试往redis中添加string 数据
		//res1, err := reDB.Set(config.GetCtx(), "name", user.Name, time.Minute).Result()
		//if err != nil {
		//	fmt.Println(err)
		//}
		//fmt.Printf("插入成功:%s\n", res1)

		//测试往redis中批量添加string 数据
		//res2, err := reDB.MSet(config.GetCtx(), "user_id", user.ID, "age", user.Age).Result()
		//if err != nil {
		//	fmt.Println(err)
		//}
		//fmt.Printf("插入多行成功:%s\n", res2)

		// 测试从redis中取出数据
		//fmt.Printf("取出数据userId:%s\n", reDB.Get(config.GetCtx(), strconv.Itoa(int(user.ID))))
		//fmt.Printf("取出数据userAge:%s\n", reDB.Get(config.GetCtx(), strconv.Itoa(user.Age)))

		// 删除user_id=1 数据
		//n, err := reDB.Del(config.GetCtx(), "user_id", strconv.Itoa(int(user.ID))).Result()
		//if err != nil {
		//	fmt.Println(err)
		//}
		//fmt.Printf("删除了%d\n", n)

		// 以上只是对redis中string 操作,其它list,hash,set查看具体官方文档
		// 附几篇不错的博客:https://blog.csdn.net/qq_21275565/article/details/129904644,
		//https://blog.csdn.net/weixin_43495948/article/details/127893883?ops_request_misc=&request_id=&biz_id=102&utm_term=go%20%E9%9B%86%E5%90%88redis%20%E6%B5%8B%E8%AF%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-127893883.142^v99^pc_search_result_base4&spm=1018.2226.3001.4187

		c.JSON(http.StatusOK, user)
	})

	log.Println("Server is running on port 8000")
	// 和http.HandleFunc使用
	//log.Fatal(http.ListenAndServe(":8000", nil))

	// 和router := gin.Default()使用
	log.Fatal(router.Run(":8000"))
}

2.相关sql

CREATE TABLE `users` (
                         `id` int(11) NOT NULL AUTO_INCREMENT,
                         `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
                         `age` int(12) DEFAULT '18',
                         PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;



INSERT INTO `user_demo`.`users` (`id`, `name`, `age`) VALUES (1, 'aa', 12);
INSERT INTO `user_demo`.`users` (`id`, `name`, `age`) VALUES (2, 'bb', 22);

3.测试
3.1 get
在这里插入图片描述

3.2 post
这里面包括了测试redis
在这里插入图片描述
在这里插入图片描述4.完整代码
项目地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系,这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的,Mybatis中存在两级缓存。分别是一级缓存(会话级),和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…

自动化网络故障管理

故障管理是网络管理的组成部分,涉及检测、隔离和解决问题,如果实施得当,网络故障管理可以使连接、应用程序和服务保持在最佳水平,提供容错能力并最大限度地减少停机时间,专门为此目的设计的平台或工具称为故障管理系统…

UDS Flash刷写用例简单介绍

文章目录 1.Boot的功能1.1 目的1.2 功能 2.测试用例设计2.1 设计框架2.2 正向测试2.1.1 刷写流程2.1.2 重复刷写2.1.3压力刷写 2.3 逆向测试2.2.1 断电后刷写2.2.2 中断通讯后刷写2.2.3 篡改刷写数据2.2.4 修改软件校验数据2.2.5 修改刷写流程2.2.6 高负载刷写2.2.7 高低压刷写…

C++数据结构——红黑树

一,关于红黑树 红黑树也是一种平衡二叉搜索树,但在每个节点上增加一个存储位表示节点的颜色,颜色右两种,红与黑,因此也称为红黑树。 通过对任意一条从根到叶子的路径上各个节点着色方式的限制,红黑树可以…

ChatGLM论文解读

GLM GLM: General Language Model Pretraining with Autoregressive Blank Infilling 论文地址 1. 背景介绍 1)主流预训练框架 模型介绍结构特点训练目标autoregressive自回归模型,代表GPT,本质上是一个从左到右的语言模型,常用于无条件生成任务(unconditional generat…

[BJDCTF2020]ZJCTF,不过如此(特详解)

php特性 1.先看代码,提示了next.php,绕过题目的要求去回显next.php 2.可以看到要求存在text内容而且text内容强等于后面的字符串,而且先通过这个if才能执行下面的file参数。 3.看到用的是file_get_contents()函数打开text。想到用data://协…

Airflow【部署 01】Airflow官网Quick Start实操(一篇学会部署Airflow)

Airflow官网Quick Start实操 1.环境变量设置2.使用约束文件进行安装3.启动单机版3.1 快速启动3.2 分步骤启动3.3 启动后3.4 服务启动停止脚本 4.访问4.1 登录4.2 测试 来自官网的介绍: https://airflow.apache.org/ Airflow™是一个由社区创建的平台,以…

【Unity学习笔记】第十一 · 动画基础(Animation、状态机、root motion、bake into pose、blendTree、大量案例)

转载引用请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/132081959 作者:CSDN|Ringleader| 如果本文对你有帮助,不妨点赞收藏关注一下,你的鼓励是我前进最大的动力!ヾ(≧▽≦*)o 主…

SSL证书 DV、OV、EV等级的证书适用群体

DV(Domain Validation,域名验证)证书 特点:DV证书是最基础的SSL/TLS证书类型,仅验证申请证书的实体是否对该域名有控制权。验证过程相对简单快速,通常只需要验证域名的所有权即可。 适用人群:…

教学方法有哪些种类

作为一位老师,面对不同的学生和课程,掌握多种教学方法是必不可少的。你知道吗?教学方法不仅关乎教学效果,还直接影响学生的学习热情和兴趣。这篇文章将为你揭秘教学方法的神秘面纱,看看有哪些种类的教学方法&#xff0…

初识计算机网络 | 计算机网络的发展 | 协议初识

1.计算机网络的发展 “矛盾是普遍存在的,矛盾是事物联系的实质内容和事物发展的根本动力!” 计算机在诞生之初,在军事上用来计算导弹的弹道轨迹!在发展的过程中(商业的推动,国家政策推动)&…

Nginx 配置解析:从基础到高级应用指南

Nginx 配置解析:从基础到高级应用指南 Nginx 配置解析:从基础到高级应用指南1. 安装和基本配置安装 Nginx基本配置 2. 虚拟主机配置3. 反向代理配置4. 负载均衡配置5. SSL 配置6. 高级配置选项结语 Nginx 配置解析:从基础到高级应用指南 Ngi…

rank是MySQL关键字

MySQL有rank关键字,建议将rank替换为rank 。不是单引号 是键盘1左边的符号。 rank():返回的相关等级会跳跃; dense_rank():返回的相关等级不会跳跃; row_number():返回的是行信息,没有排名&a…

elementui的el-table自定义控制展开事件,实现“展开”“收起”的切换(两种效果)【超级完整式代码】

第一种&#xff1a;多行点击展开其他行不收起 先看效果图 直接上代码 【核心代码添加标注简单易懂】 <el-tableref"multipleTable":data"smsLogList.slice((currentPage - 1) * pageSize_, currentPage * pageSize_)"tooltip-effect"dark"st…

程序员必备的20个学习网站

今天好学编程小编整理了20个程序员必备的学习网站&#xff0c;此篇对于新手程序员比较有用&#xff0c;技术老鸟们也可以查缺补漏。话不多说&#xff0c;纯纯干货呈上&#xff0c;赶紧点个赞收藏&#xff0c;以后会用得上&#xff01; 技术网站类 1、博客园 一个面向开发者的…

6.jmeter非GUI命令及Beanshell组件

一、非GUI&#xff08;界面&#xff09;命令详解 1. -n 使用非gui方式&#xff0c;不能单独使用&#xff0c;必须和-t&#xff08;指定jmeter的脚本&#xff09;一起用。 #cmd命令行模式下&#xff0c;进入存放测试jmx文件的目录下 jmeter -n -t hello.jmx只会生成一个log日…

docker 安装redis

1. docker pull redis指定版本安装&#xff1a; docker pull redis:5.0 # 5.0 是指定版本号2运行redis docker run --name my-redis -p 6379:6379 -d redis 3查看 docker ps 6停止启动redis docker stop my-redis docker start my-redis 补充知识点 docker ps -a…

五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试。 接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架如何搭建&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发…

线上版本升级 — — pg数据库备份

线上版本升级 — — pg数据库备份 在版本升级之前&#xff0c;我们通常为了保险都需要将数据库里的数据结构备份一份&#xff0c;防止升级失败之后数据丢失。&#xff08;根据业务而来&#xff0c;并非所有业务都需要备份&#xff09; 1 备份 1.1 pg_dump&#xff1a;备份指定…

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…