【golang】实现通用的get/post请求(接受一个 URL 和一个结构体参数)

通用的GET请求

实现一个通用的 GET 请求函数,该函数接受一个 URL 和一个结构体参数,并将结构体参数编码为查询参数。以下是一个通用的示例代码:

package mainimport ("fmt""net/http""net/url""reflect""strings"
)func getFunc(baseUrl string, structParam interface{}) {// 创建查询参数queryParams := url.Values{}v := reflect.ValueOf(structParam)t := v.Type()// 遍历结构体字段,将字段名和值添加到查询参数for i := 0; i < v.NumField(); i++ {field := t.Field(i)value := v.Field(i)// 使用 struct 标签中的 "query" 值作为查询参数的键名queryKey := field.Tag.Get("query")if queryKey == "" {// 如果没有指定查询参数的键名,则使用字段名queryKey = field.Name}// 将字段值转换为字符串并添加到查询参数queryValue := fmt.Sprintf("%v", value.Interface())queryParams.Add(queryKey, queryValue)}// 构建带查询参数的 URLurlWithParams := baseUrl + "?" + queryParams.Encode()req, err := http.NewRequest("GET", urlWithParams, nil)if err != nil {panic(err)}// 创建 HTTP 客户端并发送请求client := &http.Client{}resp, err := client.Do(req)if err != nil {panic(err)}defer resp.Body.Close()// 读取响应内容body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("HTTP GET error: %v\n", err)return}// 检查响应状态码if resp.StatusCode == http.StatusOK {fmt.Println("Request successful:", string(body))} else {fmt.Printf("Request failed with status: %d\n", resp.StatusCode)}
}func main() {// 示例结构体type ExampleParam struct {UserId    int    `query:"user_id"`Username  string `query:"username"`Page      int    `query:"page"`PageSize  int    `query:"page_size"`}// 调用通用 GET 请求函数baseURL := "https://example.com/api/endpoint"params := ExampleParam{UserId:    123456,Username:  "john_doe",Page:      1,PageSize:  10,}getFunc(baseURL, params)
}

上述代码中的 getFunc 函数是通用的,它接受一个 URL 和一个结构体参数,并将结构体参数的字段值编码为查询参数,然后发送 HTTP GET 请求。你可以根据需要调用 getFunc 函数,并传递不同的结构体参数和目标 URL。这使得你可以轻松地实现多个不同的 GET 请求,而不需要为每个请求都编写独立的代码。

通用的POST请求

同样,实现一个通用的 postFunc 函数,该函数接受一个 URL 和一个结构体参数,并将结构体参数编码为 JSON 数据,然后发送 HTTP POST 请求。以下是一个通用的示例代码:

package mainimport ("bytes""encoding/json""fmt""net/http"
)func postFunc(baseUrl string, structParam interface{}) {// 将结构体参数编码为 JSON 数据jsonData, err := json.Marshal(structParam)if err != nil {panic(err)}// 创建 HTTP 请求req, err := http.NewRequest("POST", baseUrl, bytes.NewBuffer(jsonData))if err != nil {panic(err)}// 设置请求头,指定 JSON 内容类型req.Header.Set("Content-Type", "application/json")// 创建 HTTP 客户端并发送请求client := &http.Client{}resp, err := client.Do(req)if err != nil {panic(err)}defer resp.Body.Close()// 读取响应内容body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("HTTP POST error: %v\n", err)return}// 检查响应状态码if resp.StatusCode == http.StatusOK {fmt.Println("Request successful:", string(body))} else {fmt.Printf("Request failed with status: %d\n", resp.StatusCode)}
}func main() {// 示例结构体type ExampleParam struct {UserId   int    `json:"user_id"`Username string `json:"username"`}// 调用通用 POST 请求函数baseURL := "https://example.com/api/endpoint"params := ExampleParam{UserId:   123456,Username: "john_doe",}postFunc(baseURL, params)
}

上述代码中的 postFunc 函数是通用的,它接受一个 URL 和一个结构体参数,并将结构体参数的字段值编码为 JSON 数据,然后发送 HTTP POST 请求。你可以根据需要调用 postFunc 函数,并传递不同的结构体参数和目标 URL。这使得你可以轻松地实现多个不同的 POST 请求,而不需要为每个请求都编写独立的代码。

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

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

相关文章

玩转Mysql系列 - 第19篇:游标详解

这是Mysql系列第19篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 代码中被[]包含的表示可选&#xff0c;|符号分开的表示可选其一。 需求背景 当我们需要对一个select的查询结果进行遍历处理的时候&#xff0c;如何实现呢&#xff1f; 此时我们需要使…

一文带你走进软件测试的大门

目录 前言 需求 用户需求 软件需求 从测试人员的角度看需求 测试用例 测试环境 测试数据 预期结果 操作步骤 为什么要有测试用例 Bug的概念 世界上的第一个bug bug的定义 开发模型和测试模型 软件的生命周期 开发模型 瀑布模型 螺旋模型 增量、迭代 敏捷 …

C++--简单实现定长内存池

1.什么是定长内存池 在C/C中&#xff0c;动态申请内存都是通过malloc来申请的&#xff0c;但是实际上不是是直接从堆上直接申请的内存&#xff0c;而是通过malloc动态申请一大块内存&#xff0c;malloc就相当于一块内存池&#xff0c;然后分给程序使用&#xff0c;如果申请的内…

ResponseBodyAdvice 获取参数

废话不多说&#xff0c;简练&#xff0c;一针见血&#xff0c;解决问题&#xff0c;才是最好的。 首先肯定是重写了这个beforeBodyWrite方法 重点来了&#xff0c;获取请求参数&#xff1a; request.getBody()返回一个inputStream流&#xff0c;这里你可以 使用很多方法把这个…

Android 串口通讯

Serial Port Android 串口通讯 arm64-v8a、armeabi-v7a、x86、x86_64 AAR 名称操作serial.jar下载arm64-v8a下载armeabi-v7a下载x86下载x86_64下载arm-zip下载x86-zip下载 Maven 1.build.grade | setting.grade repositories {...maven { url https://jitpack.io } }2./a…

《PostgreSQL中的JSON处理:技巧与应用》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

驱动开发--day2(内核不同模块的相互访问、字符设备驱动、led控制实验代码及现象)

实现三盏灯的控制&#xff0c;编写应用程序测试 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#define LED2_MODER 0X50007000 #define LED2_ODR 0X50007014#endif mychrdev.c #inc…

MyBatisPlus(二)基础Mapperr接口:增删改查

MyBatisPlus&#xff1a;基础Mapper接口&#xff1a;增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(use…

LeetCode(力扣)406. 根据身高重建队列Python

LeetCode406. 根据身高重建队列 题目链接代码 题目链接 https://leetcode.cn/problems/queue-reconstruction-by-height/ 代码 class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:people.sort(key lambda x: (-x[0], x[1]))que […

CSS:实现文字溢出显示省略号且悬浮显示tooltip完整信息

组件&#xff1a; element ui中的tooltip组件 思路&#xff1a;通过ref获取宽度进行判断&#xff0c;当子级宽度大于对应标签/父级宽度显示tooltip组件 <div class"bechmark-wrap"><ul ref"bechmarkUl"><liv-for"(item,index) in comp…

MySQL数据库技术笔记(1)

MySQL是一种关系数据库管理系统. 按照数据结构来组织、存储和管理数据的仓库. 数据库的发展&#xff1a; 1.层次模型存储&#xff1a;归为大类&#xff0c;分小类&#xff0c;也称树形结构 2.网状模型 3.关系模型&#xff1a;1对1的关系&#xff0c;1对多的关系&#xff0…

Mac/m1终端配置自动登录ssh服务器等后续操作

当我们每次连接ssh服务器的时候&#xff0c;都要输入账号密码等重复性的操作&#xff0c;这些动作让我们烦不胜烦。 那怎么办呢&#xff1f;有没有什么玩意能让我们只输入一条命令&#xff0c;并且根据传参来自动的执行这些固定的操作呢&#xff1f; 针对这个问题&#xff0c;我…

C++之生成详细汇编代码(二百一十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Android HAL - hidl-gen

1.hidl-gen的使用 hidl-gen 编译器会将 .hal 文件编译成一组 .h 和 .cpp 文件,这些 自动生成的文件用于编译客户端 / 服务端实现链接到的共享库,同 时也可以生成 Android.bp 编译文件。 1.1 生成的文件 HIDL 软件包中自动生成的文件会关联到与该软件…

218. 扑克牌 - 记忆化概率dp

Admin 生日那天&#xff0c;Rainbow 来找 Admin 玩扑克牌。 玩着玩着 Rainbow 觉得太没意思了&#xff0c;于是决定给 Admin 一个考验。 Rainbow 把一副扑克牌(54 张)随机洗开&#xff0c;倒扣着放成一摞。 然后 Admin 从上往下依次翻开每张牌&#xff0c;每翻开一张黑桃、红…

留资机器人助你有效提高营销成功率

我们都知道&#xff0c;当客户产生留资行为&#xff0c;就要抓住机会&#xff0c;让工作人员及时地对客户进行回访&#xff0c;然后将留资线索跟踪、维系。而如何准确有效地提高客户保留率和转化率是营销成功的关键。所以对于企业来说&#xff0c;留资机器人正是引导客户留资&a…

Nebula Graph图数据库教程介绍

Nebula Graph图数据库教程介绍 ​ Nebula Graph&#xff08;星云图&#xff09;是一个开源的分布式图数据库系统&#xff0c;最初由中国的石墨烯数据库团队开发。它专门设计用于处理大规模图数据&#xff0c;并提供了高度可扩展性和性能。Nebula Graph支持多种图数据库的核心特…

Android笔记(二十九):利用python自动生成多语言

背景 项目需要支持十几种多语言&#xff0c;而且每个版本的新功能ui都有很多地方需要多语言&#xff0c;如果手动添加非常耗时&#xff0c;于是设计了一个python脚本&#xff0c;通过excel表格转化多语言到项目values/strings文件内 步骤 android工程项目结构 脚本位于langu…

Android官方推荐 无需向应用授予的照片选择器工具

官网链接 Photo picker | Android Developers 不能跳转链接看这 Photo picker 照片选择器对话框会显示在您的设备上的媒体文件中。选择一张照片与应用程序分享。 图1. 照片选择器提供了一个直观的用户界面&#xff0c;用于与您的应用程序分享照片。 照片选择器提供了一个可…

Excel数学、工程和科学计算插件:FORMULADESK Studio

如果 Excel 是您的武器 - 让我们磨砺您的剑&#xff01;为整天使用 Excel 的人们提供创新的 Excel 加载项&#xff0c;你需要这个 FORMULADESK Studio。。。 Excel 插件为任何使用 Excel 执行数学、工程和科学计算的人提供了必备工具。 * 将公式视为真正的数学方程 * 为您的公…