Go 标准库之 GoRequests 介绍与基本使用

Go 常用标准库之 GoRequests 介绍与基本使用

一、介绍

官方文档 DOC: https://pkg.go.dev/github.com/levigross/grequests

Github: http://github.com/levigross/grequests

Python中的Requests库非常强大,所以Go开发者模仿Python的Requests库,由此诞生了Grequests库。Grequests提供了一系列便利功能,使得发送HTTP请求变得简单高效。下面就是Grequests在Golang中实现的一些关键特性:

  • 响应序列化Grequests支持将HTTP响应内容序列化为JSON和XML格式,让处理API响应时更为方便。
  • 文件上传和下载:提供了便捷的方式来上传和下载文件,无需复杂的配置。
  • HTTP动词支持:支持广泛的HTTP动词,包括GET、HEAD、POST、PUT、DELETE、PATCH以及OPTIONS,可以覆盖大多数HTTP请求场景。

二、安装

要开始使用Grequests库,你需要先在你的Go环境中安装它。通过下面的命令即可完成安装:

go get -u github.com/levigross/grequests

三、导入

在安装完Grequests后,你可以通过import语句把它引入到你的Go代码中:

import "github.com/levigross/grequests"

四、基本使用

4.1 发送GET 请求

下面是一个发送GET请求的示例,其中演示了如何获取HTTP响应并打印出来:

func Get() {
    resp, err := grequests.Get("http://127.0.0.1:8080/book/", nil)
    if err != nil {
        log.Fatalln("Unable to make request: ", err)
    }

    if !resp.Ok {
        log.Fatalln("请求超时!")
    }

    // 解析响应的JSON数据
    var data []map[string]interface{}
    if err := resp.JSON(&data); err != nil {
        log.Fatalln("Unable to parse JSON response: ", err)
    }
    fmt.Println(data)
}

上面的代码首先使用Get方法发送GET请求,然后检查是否有错误发生。如果没有错误,就可以通过resp.Json()方法获取响应的文本内容。

4.2 POST请求发送JSON数据

在下面的例子中,我们创建了一个map对象来保存我们想要发送的JSON数据。然后我们通过ROption创建了一个请求选项对象,并在其中指定了JSON为发送的数据类型。最后,我们调用Post方法来发送请求:

func Post() {
    postData := map[string]string{
        "id":   "1",
        "name": "Go入门到进阶",
    }
    geq := &grequests.RequestOptions{
        JSON: postData,
    }
    resp, err := grequests.Post("http://127.0.0.1:8080/book/create", geq)
    if err != nil {
        log.Fatalln("Unable to make request: ", err)
    }
    fmt.Println(resp.String())
}

下面是代码的逐行解释:

  1. postData := map[string]string{"id": "1", "name": "Go入门到进阶"}
    • 这里定义了一个map[string]string类型的变量postData,其中包含了两个键值对,分别是"id"和"name",它们的值分别是"1"和"Go入门到进阶"。
  2. geq := &grequests.RequestOptions{JSON: postData}
    • 这里创建了一个grequests.RequestOptions类型的变量geqgrequests.RequestOptions是一个结构体,用于配置HTTP请求的各种选项,如URL、方法、头信息、数据等。在这个例子中,我们通过JSON字段将postData作为JSON数据传递给POST请求。
  3. resp, err := grequests.Post("http://127.0.0.1:8080/book/create", geq)
    • 这里调用grequests.Post函数发起一个POST请求。http://127.0.0.1:8080/book/create是请求的目标URL,而geq是请求的配置选项。grequests.Post函数会返回一个Response对象和一个可能的错误。
  4. if err != nil { log.Fatalln("Unable to make request: ", err) }
    • 如果grequests.Post函数调用时发生错误,这个条件块会执行。log.Fatalln函数会打印错误消息并退出程序。
  5. fmt.Println(resp.String())
    • 如果请求成功,这个条件块会执行。resp.String()方法会返回响应体的字符串表示,然后使用fmt.Println函数将其打印到标准输出。
      总的来说,这段代码的作用是向本地服务器(假设在127.0.0.1:8080上)的/book/create路径发送一个POST请求,请求体是JSON格式的数据,包含一个ID和书名。如果请求成功,它会打印出服务器的响应。如果请求失败,它会打印出错误信息并退出程序。

4.3 Post 文件上传

文件上传同样简单。你可以通过RequestOptions指定文件:

func UploadFile() {
    // 允许您通过指定磁盘上的位置来创建FileUpload结构片
    // 打开要上传的文件
    file, err := os.Open("./go.mod")
    if err != nil {
        log.Fatalln("Unable to open file: ", err)
    }
    defer file.Close()

    // 创建FileUpload结构片
    ro := &grequests.RequestOptions{
        Files: []grequests.FileUpload{{
            FileName:     "1.txt", // 上传后的文件名称
            FieldName:    "file",  // 上传文件对应字段
            FileContents: file, // 使用文件内容作为FileContents
        }},
    }
    // 发送POST请求
    resp, err := grequests.Post("http://127.0.0.1:8080/book/upload/", ro)
    if err != nil {
        log.Fatalln("Unable to make request: ", err)
    }
    fmt.Println(resp.String())
}

在上述代码中,我们创建了一个FileUpload结构,通过FileNameFieldNameFileContents来指定我们要上传的文件详情。

4.4 GoRequests 使用代理

gorequest代理,下面是一个简单的例子,需要把Proxies中的URL添加为*url.URL代理:

func Proxy() {
    // 代理服务器
    const proxyServer = "http-pro.xxx.com:9010"

    // 代理隧道验证信息
    const proxyUser = "xxxxxxxxx"
    const proxyPass = "xxxxxxxxx"

    // 初始化代理URL
    proxyUrl, _ := url.Parse("http://" + proxyUser + ":" + proxyPass + "@" + proxyServer)

    // 创建请求选项
    ro := &grequests.RequestOptions{
        Proxies: map[string]*url.URL{
            "http": proxyUrl,
        },
        Headers: map[string]string{
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
        },
    }

    // 发起GET请求
    resp, err := grequests.Get("http://www.example.com", ro)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 打印响应状态码
    fmt.Println("Status code:", resp.StatusCode)

    // 打印响应体
    fmt.Println("Response:", resp.String())
}

下面是代码的逐行解释:

  1. // 代理服务器
    • 这一行是一个注释,声明了接下来的代码将定义代理服务器的URL。
  2. const proxyServer = "http-pro.xxx.com:9010"
    • 这里定义了一个常量proxyServer,它的值是代理服务器的URL,格式为http://host:port
  3. // 代理隧道验证信息
    • 这一行是一个注释,声明了接下来的代码将定义代理隧道的验证信息。
  4. const proxyUser = "xxxxxxxxx"
    • 这里定义了一个常量proxyUser,它的值是代理隧道的用户名。
  5. const proxyPass = "xxxxxxxxx"
    • 这里定义了一个常量proxyPass,它的值是代理隧道的密码。
  6. // 初始化代理URL
    • 这一行是一个注释,说明接下来的代码将创建代理URL。
  7. proxyUrl, _ := url.Parse("http://" + proxyUser + ":" + proxyPass + "@" + proxyServer)
    • 这行代码使用url.Parse函数创建了一个代理URL。它将代理隧道的用户名、密码和代理服务器地址组合成一个URL,格式为http://username:password@host:port_是忽略返回值的约定,因为返回值通常不需要使用。
  8. // 创建请求选项
    • 这一行是一个注释,说明接下来的代码将创建一个grequests.RequestOptions结构体,用于配置HTTP请求。
  9. ro := &grequests.RequestOptions{
    • 这里开始定义grequests.RequestOptions结构体变量ro
  10. Proxies: map[string]*url.URL{
    • 这里定义了Proxies字段,它是一个映射,将协议(如"http")映射到代理URL。
  11. "http": proxyUrl,
    • 这行代码将代理URL设置为HTTP协议的代理。
  12. },
    • 这是映射定义的结束。
  13. Headers: map[string]string{
    • 这里定义了Headers字段,它是一个映射,将HTTP头字段(如"user-agent")映射到相应的值。
  14. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
    • 这行代码设置了一个HTTP头字段,即用户代理(User-Agent),用于标识发起请求的客户端。
  15. },
    • 这是映射定义的结束。
  16. }
    • 这是grequests.RequestOptions结构体变量的定义结束。
  17. // 发起GET请求
    • 这一行是一个注释,说明接下来的代码将发起一个GET请求。
  18. resp, err := grequests.Get("http://www.example.com", ro)
    • 这行代码使用grequests.Get函数发起一个GET请求。http://www.example.com是请求的目标URL,而ro是请求的配置选项。grequests.Get函数会返回一个Response对象和一个可能的错误。
  19. if err != nil {
    • 如果grequests.Get函数调用时发生错误,这个条件块会执行。
  20. fmt.Println("Error:", err)
    • 这行代码打印出错误信息。
  21. return
    • 这行代码表示如果发生错误,函数将返回,不继续执行。
  22. }
    • 这是错误处理块的结束。
  23. fmt.Println("Status code:", resp.StatusCode)
    • 如果请求成功,这行代码会打印出响应的状态码。
  24. fmt.Println("Response:", resp.String())

4.5 Gorequests 使用session

下面是使用Session的一个例子:

session := grequests.Session{
        RequestOptions: &grequests.RequestOptions{
            Headers: map[string]string{
                "authority":  "mp3.haoge500.com",
                "referer":    "https://www.zz123.com/",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
            },
        },
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • requests是python实现的最简单易用的HTTP库,建议爬虫使用requests import reque...
    HaringLi阅读 592评论 0 0
  • urllib库 python2中,由urllib和urllib2两个库来发送请求,python3中没有urllib...
    Arale_zh阅读 171评论 0 0
  • 一. go-resty一个优秀的 HTTP 客户端库go-resty超时控制示例go-resty自动重示例go-r...
    aZ_be5e阅读 700评论 0 0
  • 上一篇:8.Urllib库基本使用下一篇:10.正则表达式基础 requests是python实现的最简单易用的H...
    在努力中阅读 3,339评论 2 11
  • requests是python实现的最简单易用的HTTP库,建议爬虫使用requests 获取某个网页 各种请求 ...
    田小田txt阅读 89,412评论 0 34