Go语言:构建并发送HTTP请求

在开发过程中,我们经常需要向其他服务器发送HTTP请求并处理它们的响应。Go语言提供了强大的内置库来帮助我们完成这项任务。在本文中,我们将详细介绍如何使用Go的net/http包来构建和发送HTTP请求。

以下是我们将要使用的完整的Go代码:

package http

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strings"
)

// HTTP请求参数
type RequestParam struct {
	Url     string
	Method  string
	Header  map[string]interface{}
	Query   map[string]interface{}
	Json    map[string]interface{}
	Form    map[string]interface{}
	Context context.Context
}

var client = http.DefaultClient

// HTTP请求
func SendRequest(requestParam *RequestParam) (string, error) {

	var (
		request *http.Request
		err     error
	)

	// 创建一个新的HTTP请求
	request, err = createRequest(requestParam)
	if err != nil {
		return "", err
	}

	// 设置请求头部信息
	if requestParam.Header != nil {
		for key, value := range requestParam.Header {
			request.Header.Set(key, fmt.Sprint(value))
		}
	}

	// 将请求与提供的context相关联
	if requestParam.Context != nil {
		request.WithContext(requestParam.Context)
	}

	// 发送HTTP请求
	result, err := client.Do(request)
	if err != nil {
		return "", err
	}

	defer result.Body.Close()

	// 读取响应体内容,并加入缓冲区
	var buffer bytes.Buffer
	if _, err = io.Copy(&buffer, result.Body); err != nil {
		return "", err
	}

	return buffer.String(), nil
}

// 创建http请求
func createRequest(requestParam *RequestParam) (*http.Request, error) {

	switch strings.ToLower(requestParam.Method) {
	case "get":
		return getRequest(requestParam)
	case "post":
		return postRequest(requestParam)
	default:
		return getRequest(requestParam)
	}
}

// get请求
func getRequest(requestParam *RequestParam) (*http.Request, error) {

	// 解析URL
	url, err := url.Parse(requestParam.Url)
	if err != nil {
		return nil, err
	}

	query := url.Query()
	for key, value := range requestParam.Query {
		query.Set(key, fmt.Sprint(value))
	}
	url.RawQuery = query.Encode()

	// 更新请求参数的URL
	requestParam.Url = url.String()

	return http.NewRequest("GET", requestParam.Url, nil)
}

// post请求
func postRequest(requestParam *RequestParam) (*http.Request, error) {

	var body io.Reader

	// Json 传参
	if requestParam.Json != nil {
		// 将json序列化为字节数组
		jsonData, _ := json.Marshal(requestParam.Json)
		body = bytes.NewBuffer(jsonData)
	}

	// Form 传参
	if requestParam.Form != nil {
		// 创建表单数据
		formData := url.Values{}
		for key, value := range requestParam.Form {
			formData.Add(key, fmt.Sprint(value))
		}
		body = strings.NewReader(formData.Encode())
	}

	return http.NewRequest("POST", requestParam.Url, body)
}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值