Golang极简HTTP客户端“GoRequest”教程-《GO开发知识笔记》

admin 2025-11-04 01:26:27 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 一、什么是GoRequest?
  • 二、GoRequest 安装方法
  • 三、GoRequest 使用方法
    • 1、HTTP请求方式
    • 2、JSON 格式请求参数
    • 3、支持回调函数 Callback
    • 4、请求控制
    • 5、返回结果处理方式

    一、什么是GoRequest?

    GoRequest 是一个极简的 HTTP 客户端,作者灵感来源于 Node.js 库 SuperAgent。相比 Golang 标准库 net/http,GoRequest 使用起来更加简单。GoRequest 官方的口号是 “像机枪一样发送请求”。

    GoRequest 包含以下功能:

    • 支持 HTTP 请求方式:Get/Post/Put/Head/Delete/Patch/Options
    • 支持设置 header 请求头
    • 支持使用 JSON 字符串作为请求参数
    • 支持将多路请求的方式发送数据和文件
    • 支持通过代理发送请求 支持为请求设置超时
    • 支持 TLS 客户端设置
    • 支持设置重定向策略
    • 支持为请求设置 cookie CookieJar - automatic in-memory cookiejar
    • 支持请求头设置基本身份认证

    二、GoRequest 安装方法

    只需要直接执行命令:

    1. go get github.com/parnurzeal/gorequest

    三、GoRequest 使用方法

    1、HTTP请求方式

    Golang 发送一个简单的 Get 请求,使用 net/http 标准库和使用 GoRequst 库,两种发送 Get 请求的方式都比较简单。

    示例代码如下:

    标准库方式:

    1. resp, err := http.Get("http://example.com/")

    GoRequest 库方式:

    1. request := gorequest.New() resp, body, errs := request.Get("http://example.com/").End()
    2. (该 GoRequest 方式无法复用对象)
    3. resp, body, errs := gorequest.New().Get("http://example.com/").End()

    阅读上面这两段代码,我们可以发现,使用标准库的方式发送 Get 请求,甚至比使用 GoRequest 库的方式发送 Get 请求更加简单。但是,当我们需求稍作修改,比如我们需要为 Get 请求,设置 header 头和设置重定向策略。我们再来看一下分别使用标准库和 GoRequest 库两种实现方式。

    标准库方式:

    1. client := &http.Client{
    2. CheckRedirect: redirectPolicyFunc,
    3. }
    4. req, err := http.NewRequest("GET", "http://example.com", nil)
    5. req.Header.Add("If-None-Match", `W/"wyzzy"`)
    6. resp, err := client.Do(req)

    GoRequest 库方式(其它 HTTP 请求方式与 Get 使用方式相同):

    1. request := gorequest.New()
    2. resp, body, errs := request.Get("http://example.com").
    3. RedirectPolicy(redirectPolicyFunc).
    4. Set("If-None-Match", `W/"wyzzy"`).
    5. End()

    阅读上面两段代码,很容易发现使用 GoRequest 方式使实现更加简单。使用标准库方式,首先需要创建一个 Client,然后使用不同的命令设置 header 头等操作,这仅仅是为了实现一个 HTTP 请求。而使用 GoRequest 方式,仅需链式调用两个方法即可轻松实现。

    2、JSON 格式请求参数

    在 Golang 语言中,如果使用标准库 net/http 发送请求参数为 JSON 格式的 POST 请求,首先需要先将 map 或 struct 类型的数据,使用标准库 encoding/json 的 Marshal 方法,将数据转换为 JSON 格式的数据,并且设置 header 头参数 Content-Type 的值为 application/json,然后创建一个 Client,最终你的代码变得越来越长,越来越难维护。

    标准库方式:

    1. m := map[string]interface{}{
    2. "name": "backy",
    3. "species": "dog",
    4. }
    5. mJson, _ := json.Marshal(m)
    6. contentReader := bytes.NewReader(mJson)
    7. req, _ := http.NewRequest("POST", "http://example.com", contentReader)
    8. req.Header.Set("Content-Type", "application/json")
    9. req.Header.Set("Notes","GoRequest is coming!")
    10. client := &http.Client{}
    11. resp, _ := client.Do(req)

    如果使用 GoRequest 库发送请求参数为 JSON 格式的 POST 请求,因为它默认支持 JSON 格式的请求参数,所以它只需要一行代码就可以实现。

    GoRequest 库方式:

    1. request := gorequest.New()
    2. resp, body, errs := request.Post("http://example.com").
    3. Set("Notes","gorequst is coming!").
    4. Send(`{"name":"backy", "species":"dog"}`).
    5. End()

    3、支持回调函数 Callback

    GoRequest 库还支持回调函数,你可以根据自己的项目需求灵活使用它,回调函数示例代码如下:

    1. func printStatus(resp gorequest.Response, body string, errs []error){
    2. fmt.Println(resp.Status)
    3. }
    4. gorequest.New().Get("http://example.com").End(printStatus)

    4、请求控制

    在 Golang 项目开发中,有时我们可能需要对请求做一些额外控制,比如超时处理,重试请求 N 次,重定向处理等。GoRequest 库都可以为我们提供简单的实现方式。

    超时处理:

    1. request := gorequest.New().Timeout(2*time.Millisecond)
    2. resp, body, errs:= request.Get("http://example.com").End()

    需要注意的是,Timeout 是将 Dial 连接和 IO 读写的耗时总和,与时间参数作比较。

    重试请求:

    1. request := gorequest.New()
    2. resp, body, errs := request.Get("http://example.com/").
    3. Retry(3, 5 * time.Second, http.StatusBadRequest, http.StatusInternalServerError).
    4. End()

    阅读上面这段代码,它的含义是当服务器返回结果是 http.StatusBadRequest 或 http.StatusInternalServerError 时,会每隔 5 秒重试请求一次,共重试3次。

    重定向处理:

    1. request := gorequest.New()
    2. resp, body, errs := request.Get("http://example.com/").
    3. RedirectPolicy(func(req Request, via []*Request) error {
    4. if req.URL.Scheme != "https" {
    5. return http.ErrUseLastResponse
    6. }
    7. }).
    8. End()
    1. <br />阅读上面这段代码,它的含义是将 http 请求重定向为 https 请求。

    5、返回结果处理方式

    朋友们可能已经发现,以上示例代码都是以 End 结束,End 的含义是返回结果是字符串类型,如果我们希望返回结果是其他类型,比如字节类型和结构体类型,可以将 End 分别替换为 EndBytes 和 EndStruct。

    EndBytes 格式:

    1. resp, bodyBytes, errs := gorequest.New().Get("http://example.com/").EndBytes()

    EndStruct 格式:

    1. heyYou struct {
    2. Hey string `json:"hey"`
    3. }
    4. var heyYou heyYou
    5. resp, _, errs := gorequest.New().Get("http://example.com/").EndStruct(&heyYou)

    总结本文我们介绍 Golang 语言的极简 HTTP 客户端 GoRequest 以及它的使用方法。它比标准库 net/http 使用方式简单,当我们项目开发中需要使用 HTTP 方式调用接口时,强烈推荐使用 GoRequest 库。GoRequest 底层在大多数用例中是基于 http.Client 实现的,所以通过一次调用 gorequest.New() 得到的对象,应尽可能多次使用。GoRequest 除了上面介绍的 JSON 参数,它还支持 Struct 和 File,感兴趣的读者可以查阅官方文档了解相关内容。GoRequest官方网址:https://github.com/parnurzeal/gorequest

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  8