golang的http客户端封装

简介: golang的http客户端封装

简介

net/httpGo 语言标准库的一部分,它提供了创建 HTTP 客户端和服务器的能力。这个包通过简化与 HTTP 协议的交互,让开发者能够方便地构建 HTTP 请求和响应,以及处理路由等任务。

本文以 net/http 包作为底层,封装一个包含 get , post , form-data 请求的工具包

开始

创建一个项目 demo ,并创建以下目录:

image.png

GET方法

client 文件中创建如下方法

package client
import (
    "bytes"
    "crypto/tls"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "time"
)
/***
url 请求地址
header 头部
requestData 请求数据
*/
func GET(path string,header map[string]string, requestData map[string]string) []byte  {
    if(len(requestData) >0){
        params := url.Values{}
        for k,v:=range requestData{
            params.Add(k,v)
        }
        path = path + "?" + params.Encode()
    }
    req, _ := http.NewRequest("GET", path, bytes.NewBuffer([]byte("")))
    req.Header.Set("cache-control", "no-cache")
    for key,value :=range header{
        req.Header.Set(key, value)
    }
    //过滤https证书
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        //关闭连接池,不然会打满语句柄
        DisableKeepAlives: true,
    }
    //设置请求超时时间为20秒
    client := &http.Client{
        Transport: tr,
        Timeout: 20 * time.Second,
    }
    res, err := client.Do(req)
    if res !=nil{
        defer res.Body.Close()
        body, _ := ioutil.ReadAll(res.Body)
        return body
    }
    if err !=nil {
        fmt.Printf("请求错误: %s\n", err.Error())
        return nil
    }
    return nil
}

注意:此处需要关闭连接池,不然在多携程异步调用的时候,由于请求过多,会出现语句饼打满,导致请求报错的情况。

POST



/***
url 请求地址
header 头部
requestData 请求数据,json数据
*/
func POST(path string,header map[string]string, requestData []byte) []byte  {
    req, _ := http.NewRequest("POST", path, bytes.NewBuffer(requestData))
    req.Header.Set("cache-control", "no-cache")
    _, ok := header["content-type"]
    if ok ==false {
        req.Header.Set("content-type", "application/json")
    }
    for key,value :=range header{
        req.Header.Set(key, value)
    }
    //过滤https证书
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        //关闭连接池,不然会打满语句柄
        DisableKeepAlives: true,
    }
    //设置请求超时时间为20秒
    client := &http.Client{
        Transport: tr,
        Timeout: 20 * time.Second,
    }
    res, err := client.Do(req)
    if res !=nil{
        defer res.Body.Close()
        body, _ := ioutil.ReadAll(res.Body)
        return body
    }
    if err !=nil {
        fmt.Printf("请求错误: %s\n", err.Error())
        return nil
    }
    return nil
}

FormData

/***
url 请求地址
header 头部
params 其他请求参数
paramName 文件名称
path 本地文件路径
*/
func FormData(url string,header map[string]string,params map[string]string, paramName, path string) []byte {
    file, err := os.Open(path)
    if err != nil {
        fmt.Printf("打开文件错误: %s\n", err.Error())
        return nil
    }
    defer file.Close()
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    //fmt.Printf("请求参数:%+v",params)
    part, err := writer.CreateFormFile(paramName, filepath.Base(path))
    if err != nil {
        fmt.Printf("文件错误: %s\n", err.Error())
        return nil
    }
    _, err = io.Copy(part, file)
    for key, val := range params {
        _ = writer.WriteField(key, val)
    }
    err = writer.Close()
    if err != nil {
        fmt.Printf("文件关闭错误: %s\n", err.Error())
        return nil
    }
    req, err := http.NewRequest("POST", url, body)
    req.Header.Set("Content-Type", writer.FormDataContentType())
    for key,value :=range header{
        req.Header.Set(key, value)
    }
    //过滤https证书
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        //关闭连接池,不然会打满语句柄
        DisableKeepAlives: true,
    }
    //设置请求超时时间为20秒
    client := &http.Client{
        Transport: tr,
        Timeout: 20 * time.Second,
    }
    res, err := client.Do(req)
    if res !=nil{
        defer res.Body.Close()
        body, _ := ioutil.ReadAll(res.Body)
        return body
    }
    if err !=nil {
        fmt.Printf("请求错误: %s\n", err.Error())
        return nil
    }
    return nil
}


Request

/***
url 请求地址
header 头部
requestData 请求数据
method 请求方法
*/
func Request(url string,header map[string]string, requestData []byte, method string) []byte{
    //rwLock.Lock()
    //payload := strings.NewReader(requestData)
    req, _ := http.NewRequest(method, url, bytes.NewBuffer(requestData))
    //req.Header.Set("content-type", "application/json")
    req.Header.Set("cache-control", "no-cache")
    for key,value :=range header{
        req.Header.Set(key, value)
    }
    //过滤https证书
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        //关闭连接池,不然会打满语句柄
        DisableKeepAlives: true,
    }
    //设置请求超时时间为20秒
    client := &http.Client{
        Transport: tr,
        Timeout: 20 * time.Second,
    }
    res, err := client.Do(req)
    if res !=nil{
        defer res.Body.Close()
        body, _ := ioutil.ReadAll(res.Body)
        return body
    }
    if err !=nil {
        fmt.Printf("请求错误: %s\n", err.Error())
        return nil
    }
    return nil
}


测试

新建 main.go 文件写入以下内容:

func main()  {
    sendData :=make(map[string]string)
    sendData["name"]="测试"
    sendData["sex"]="男"
    jsonStr,_:=json.Marshal(sendData)
    
    //此处需要换成你自己的接口地址
    httpUrl:="https://xxxxx/api/test"
    headerData :=make(map[string]string)
    headerData["X-Ca-Key"]="22527885"
    headerData["Content-Type"]="application/json;charset=UTF-8"
    headerData["Accept"]="application/json"
    body:=client.POST(httpUrl,headerData,jsonStr)
    fmt.Printf("请求成功返回:%s\n",body)
}

执行命令:

go run main.go

总结

本文对 net/http 包的简单封装,使用者可以直接拿来用,减少了开发成本。



相关文章
|
1月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
41 1
使用Netty实现文件传输的HTTP服务器和客户端
|
2月前
|
Go
Golang语言结构体(struct)面向对象编程进阶篇(封装,继承和多态)
这篇文章是关于Go语言中结构体(struct)面向对象编程进阶篇的教程,涵盖了Go语言如何实现封装、继承和多态,以及结构体内存布局的相关概念和案例。
145 4
|
3月前
|
存储 物联网 测试技术
Golang中的HTTP请求凝聚器
Golang中的HTTP请求凝聚器
|
4月前
|
JSON Dart API
Flutter dio http 封装指南说明
本文介绍了如何实现一个通用、可重构的 Dio 基础类,包括单例访问、日志记录、常见操作封装以及请求、输出、报错拦截等功能。
111 2
Flutter dio http 封装指南说明
|
3月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
87 1
|
4月前
|
Java Spring
spring restTemplate 进行http请求的工具类封装
spring restTemplate 进行http请求的工具类封装
204 3
|
3月前
|
网络协议 应用服务中间件 Go
[golang]使用mTLS双向加密认证http通信
[golang]使用mTLS双向加密认证http通信
|
5月前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
82 1
|
5月前
|
数据采集 Java API
Java HTTP客户端工具的演变之路
Java HTTP客户端工具的演变之路
|
5月前
|
JSON API 数据格式
curl 使用:命令行中的 HTTP 客户端
`curl` 是命令行神器,用于与服务器交互,支持HTTP、HTTPS、FTP等协议。本文教你如何用它做POST请求(-d/--data)、GET请求(-G/-d)、JSON请求(-H 'Content-Type: application/json')和文件上传(-F)。学会这些,轻松测试API、自动化任务。现在就动手试试吧!
65 0