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 包的简单封装,使用者可以直接拿来用,减少了开发成本。



目录
打赏
0
0
0
0
43
分享
相关文章
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
178 61
|
3月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
141 26
|
4月前
|
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
162 35
|
4月前
|
Golang工程组件:自定义HTTP规则的grpc-gateway选项
总的来说,grpc-gateway提供了一种简单有效的方式来为你的gRPC服务提供RESTful风格的API。通过自定义HTTP规则,你可以灵活地定义你的API的行为,以满足你的应用的需求。
99 27
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
475 29
|
8月前
|
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
202 2
|
10月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
211 1
使用Netty实现文件传输的HTTP服务器和客户端
|
11月前
|
Go
Golang语言结构体(struct)面向对象编程进阶篇(封装,继承和多态)
这篇文章是关于Go语言中结构体(struct)面向对象编程进阶篇的教程,涵盖了Go语言如何实现封装、继承和多态,以及结构体内存布局的相关概念和案例。
352 4
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
221 1

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问