简介

本文档旨在提供一个关于如何在Go语言中封装HTTP请求的指南。封装HTTP请求有助于简化代码,提高代码的可重用性和可维护性。以下是我们提供的HTTP请求封装实现和用法说明。

封装实现

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package request

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

type Request struct {
Client *http.Client
}

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

func DefaultClient() *Request {
return &Request{
Client: http.DefaultClient,
}
}

// 初始化客户端
func NewClient(client *http.Client) *Request {
return &Request{
Client: client,
}
}

// 发送请求
func (t *Request) Send(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 = request.WithContext(requestParam.Context)
}

// 发送HTTP请求
result, err := t.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
}

// 创建请求
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())
}

// Body 传参
if requestParam.Body != "" {
body = strings.NewReader(requestParam.Body)
}

return http.NewRequest("POST", requestParam.Url, body)
}