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


    通用的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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    上述代码中的 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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

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

  • 相关阅读:
    大二Web课程设计:HTML+CSS学校静态网页设计——南京师范大学泰州学院(11页)
    Spring MVC(上)
    (第2遍中)内存的堆空间不够 & error: MSB3073 & 超过了 PCH 的虚拟内存范围
    Mockito的使用指南---最后也包括了在idea中创建基本junit test的方法
    STM32将FreeRTOS移植到用CubeMX生成的HAL库中
    基于SSM在线医疗服务系统+jsp【附开题|万字文档(LW)和搭建文档】
    如何在Linux部署Portainer并结合内网穿透远程管理本地Docker容器
    主存储器与CPU的连接
    【GD32F427开发板试用】Liteos-m 移植教程(一)
    BATJM面试真题文档整理,斩获心仪offer,送给想跳槽的程序猿
  • 原文地址:https://blog.csdn.net/weixin_41093846/article/details/132871110