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

news2024/12/29 7:59:55

介绍:分别测试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.完整代码
项目地址

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

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

相关文章

【RT-DETR有效改进】交叉形窗口网络 | CSWinTransformer(附代码 + 修改教程)

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

【GitHub项目推荐--一款美观的开源社区系统】【转载】

推荐一款开源社区系统,该系统基于主流的 Java Web 技术栈,如果你是一名 Java 新手掌握了基本 JavaEE 框架知识,可以拿本项目作为练手项目。 开源社区系统功能还算完善包含发布帖子、发布评论、私信、系统通知、点赞、关注、搜索、用户设置、…

ToDesk/向日葵的MAC远程鼠标控制不了?如何解决

不知道各位使用Mac电脑的小伙伴们,在日常进行跨设备远控操作时是否曾遇到过远程鼠标控制不了的问题?其实这是因为有项系统权限没有开设导致的,本篇文章木木小编就给大家逐步教学一下针对该问题如何解决才有效! 当通过ToDesk远程连…

vue中图片不显示问题 - vue中静态资源加载

文章目录 vue中图片不显示问题静态资源URL 转换规则webpack 静态资源处理 图片不显示问题问题描述解决办法1:使用require引入require is not defined 解决办法2:使用import引入解决办法3:将图片放进公共文件夹static或public vue中图片不显示…

当世界加速离你而去

当世界加速离你而去 会不会这个标题显的太悲观,也可能是耳机里正在放着To Be Frank的原因。 对于阳历跨年我是没有太多的感觉,而且跨年夜忙着约会,所以2023年的跨年文章今天才出来。 一年的时间一晃就过了。2022年12月9日时候彻底结束了风控…

基于EfficientNet(B0-B7)全系列不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

EfficientNet系列的模型在我们前面开发识别类项目或者是检测类项目都是比较少去使用的,一方面是技术本身迭代发展的速度是比较快的,可能新的东西还没学习更新的东西就出来了,另一方面是EfficientNet本身实际业务使用度并不高,可能…

maptalks 右键删除多边形 电子围栏

<!-- 地图组件 --> <template><div :id"id" class"container"></div> </template><script> import _ from "lodash"; import "maptalks/dist/maptalks.css"; import * as maptalks from "ma…

RDMA vs InfiniBand 网卡接口如何区分?

(该架构图来源于参考文献) 高性能计算网络&#xff0c;RoCE vs. InfiniBand该怎么选&#xff1f; 新 RoCEv2 标准可实现 RDMA 路由在第三层以太网网络中的传输。RoCEv2 规范将用以太网链路层上的 IP 报头和 UDP 报头替代 InfiniBand 网络层。这样&#xff0c;就可以在基于 IP…

虹科分享丨AR与AI融合加速,医疗护理更便捷!

来源&#xff1a;虹科数字化与AR 虹科分享丨AR与AI融合加速&#xff0c;医疗护理更便捷&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/Fi0wNfk_TDXRo_1-6cSRNQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #AR眼镜 #医疗护理 根据Reports and Da…

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 map LeetCode1289. 下降路径最小和 II 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…

【自然语言处理】【深度学习】文本向量化、one-hot、word embedding编码

因为文本不能够直接被模型计算&#xff0c;所以需要将其转化为向量 把文本转化为向量有两种方式&#xff1a; 转化为one-hot编码转化为word embedding 一、one-hot 编码 在one-hot编码中&#xff0c;每一个token使用一个长度为N的向量表示&#xff0c;N表示词典的数量。 即&…

谷歌地球引擎Google Earth Engine针对不同地表类型分别自动生成随机采样点的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;按照给定的地表分类数据&#xff0c;对每一种不同的地物类型&#xff0c;分别加以全球范围内随机抽样点自动批量选取的方法。 本文是谷歌地球引擎&#xff08;Google Earth En…

05.Elasticsearch应用(五)

Elasticsearch应用&#xff08;五&#xff09; 1.目标 咱们这一章主要学习Mapping&#xff08;映射&#xff09; 2.介绍 Mapping是对索引库中文档的约束&#xff0c;类似于数据表结构&#xff0c;作用如下&#xff1a; 定义索引中的字段的名称定义字段的数据类型&#xff…

0124-2-算法题解析与总结(四)

5.5 如何去除有序数组的重复元素 本文对应的力扣题目&#xff1a; 26.删除排序数组中的重复项 83.删除排序链表中的重复元素 26.删除排序数组中的重复项&#xff1a; int removeDuplicates(int[] nums) {int n nums.length;if (n 0) return 0;int slow 0, fast 1;while…

Spring基于AbstractRoutingDataSource实现MySQL多数据源

目录 多数据源实现 yml配置文件 配置类 业务代码 案例演示 多数据源实现 yml配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezoneUTC&useUnicodetrue&characte…

第二百八十六回

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了如何拦截路由相关的内容&#xff0c;本章回中将介绍页面转场动画.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍了路由拦截相关的内容&#xff0c;本章回中将使用路由拦截实现转场…

《动手学深度学习(PyTorch版)》笔记3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;本书源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode测试通过。 Chapter3 Linear …

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中&#xff0c;中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位&#xff0c;所在部门为长城新盛信托有限责任公司。目前完成了一面&#xff0c;在这里记录一下一面经…

Puppeteer结合Jest对网页进行测试

之前我们使用Puppeteer进行网页爬虫&#xff08;以及自动化操作&#xff09;&#xff0c;这篇文章主要验证一下Puppeteer测试的可实现性。 项目设置 让我们从设置一个基本的React应用程序开始。 我们将安装其他依赖项,如Puppeteer和Faker。 为了这篇文章的目的,我创建了一个…