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

2023-09-14 10:35:55

通用的GET请求

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

package main

import (
	"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)
	}

	// 构建带查询参数的 URL
	urlWithParams := 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 main

import (
	"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 请求,而不需要为每个请求都编写独立的代码。

更多推荐

Python模拟登录豆瓣:轻松探索海量文化资源!

豆瓣是一个集电影、音乐、图书、活动等众多文化内容于一身的知名网站。在本文中,将介绍如何使用Python模拟登录豆瓣,以便获取更多的个性化推荐和参与社区活动。跟随下面的步骤,让我们一起来探索豆瓣的海量文化资源吧!一、安装必要的库在开始之前,需要确保已安装以下库:requests:发送HTTP请求,并处理登录和数据获取。B

libevent学习——event_base

event_base使用libevent函数之前需要分配一个或者多个event_base结构体。每个event_base结构体持有一个事件集合,可以检测以确定哪个事件是激活的。如果设置event_base使用锁,则可以安全地在多个线程中访问它。然而,其事件循环只能运行在一个线程中。如果需要用多个线程检测IO,则需要为每

【k8s】kube-proxy 工作模式

文章目录Userspace模式:iptables模式:负载均衡(LoadBalancing)LB轮询(RoundRobin):SessionAffinity:最少连接(LeastConnection):IP哈希(IPHash):SessionAffinity和IP哈希的异同自定义负载均衡器:IPVS模式:IPVS架构I

vue入门-->前后端分离&vue简介,vue入门,vue生命周期

前后端分离&vue简介vue入门vue生命周期1.前后端分离&vue简介什么是前后端分离?前后端分离,是开发模式上的前后端分离。当然还有项目架构方面的前后端分离,也就是在考虑请求并发,服务器性能,处理请求的效率等因素,从而进行前后端分离,对于初学者的理解来说不是那么友好,因此我们只讨论开发模式上的分离。先下定义:前后端

多位数按键操作(闪烁)数码管显示

/*-----------------------------------------------内容:按键加减数字,多个数码管显示------------------------------------------------*/#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能

Postman 的使用教程(详细)

Postman使用教程1.是什么Postman是一个接口测试工具软件,可以帮助开发人员管理测试接口。官网:https://www.getpostman.com/2.安装建议通过官网下载安装,不要去那些乱七八糟的下载平台,或者留言获取官网下载地址:https://www.getpostman.com/downloads/

flutter项目中常用第三方模块

flutter项目中常用第三方模块持续更新中序言关于第三方模块安装flutter_native_splash使用方式模块配置flutter_localizations模块配置使用方式get_storage模块配置使用方式get模块配置使用方式持续更新中序言本章介绍项目中常用第三方模块,方便快速构建项目关于第三方模块安装

JS获取经纬度, 并根据经纬度得到城市信息

在JavaScript中,获取经纬度通常需要使用定位服务,比如HTML5的GeolocationAPI。然而拿到坐标后,将经纬度转换为城市信息,则需要使用逆地理编码服务接口,比如百度或者高德的API,但是他们收费都很高,我们可以使用一些便宜的接口,效果一样的。以下是一个简单的示例:一、获取经纬度首先,你需要使用Geol

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(六)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.模型训练1)数据集分析2)数据预处理3)模型创建4)模型训练5)获取特征矩阵2.后端Django3.前端微信小程序1)小程序全局配置文件2)推荐电影页面3)个人信息界面以及用户登录记录页面相关其它博客工程源代码下载其它资料下载前言本项目专注于MovieLens

【多思路附源码持续更新】2023年华为杯(中国研究生数学建模)竞赛C题

赛题若官网拥挤,数据集和赛题下载地址如下:https://download.csdn.net/download/weixin_47723732/88364777历届优秀论文下载地址,可以做参考文章https://download.csdn.net/download/weixin_47723732/88365222论文万

Stability AI发布基于稳定扩散的音频生成模型Stable Audio

近日StabilityAI推出了一款名为StableAudio的尖端生成模型,该模型可以根据用户提供的文本提示来创建音乐。在NVIDIAA100GPU上StableAudio可以在一秒钟内以44.1kHz的采样率产生95秒的立体声音频,与原始录音相比,该模型处理时间的大幅减少归因于它对压缩音频潜在表示的有效处理。架构自

热文推荐