首页 > 其他分享 >Go 标准库之 GoRequests 介绍与基本使用

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

时间:2024-04-15 20:11:06浏览次数:49  
标签:http 请求 err grequests resp 介绍 URL 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",
			},
		},
	}

本文由博客一文多发平台 OpenWrite 发布!

标签:http,请求,err,grequests,resp,介绍,URL,Go,GoRequests
From: https://www.cnblogs.com/taoxiaoxin/p/18136833

相关文章

  • 3小时搞定DRF框架 | Django REST framework前后端分离框架实践
    DRF(全称DjangoRESTframework)是一个用于构建WebAPI的强力工具集,是一个基于Django的PythonWeb框架,它为开发人员提供了一套快速开发RESTfulAPI的工具,它能够自动化API可视化、文档化,实现接口的自动化测试以及自动化的API路由、序列化、视图、验证、分页、版本管理、认证等......
  • 深度探索:Secure Hash Algorithm(SHA)全景解析
    title:深度探索:SecureHashAlgorithm(SHA)全景解析date:2024/4/1518:33:17updated:2024/4/1518:33:17tags:SHA安全抗碰撞性算法版本实现细节性能优化发展历史应用案例密码学中的哈希函数一、哈希函数的定义哈希函数是一种数学函数,它接受任意长度的输入数据(......
  • 01、可靠性介绍
    可靠性介绍定义可靠性是降低网络中断时间、保证网络中业务质量,提升用户体验的一项技术。随着网络的快速普及和应用的日益深入,各种增值业务(如IPTV、视频会议等)得到了广泛部署,网络中断可能影响大量业务、造成重大损失。因此,作为业务承载主体的基础网络,其可靠性日益成为受关注......
  • 肖sir__app测试之介绍(18.0)
    app测试app功能测试和app自动化测试===============================(一)app手工测试app手工测试:就是在app上进行手工测试app自动化测试使用代码或工具来代替手工测试(二)web测试和app测试区别?(1)单纯从功能测试的层面上来讲的化,app测试、web测试在流程和功能测试上是没有区别(2)......
  • 15--Scrapy01:介绍与初步使用
    Scrapy01--基本介绍与初步使用一、爬虫工程化何为工程化,就是让你的程序更加的有体系,有逻辑,更加的模块化.到目前为止,我们所编写的爬虫我们都是从头到尾的每一步都要亲力亲为.这样做固然有其优点(可控性更好),但是各位请认真思考.这样的代码逻辑是不能形成批量生产的效果的(写10......
  • 一款功能齐全的iOS混淆工具介绍及功能详解
    ​机缘巧合偶遇iOS马甲包业务,前期也使用过目前市面上其他得工具,实际效果不太理想。经过大量实践,开发出一款功能齐全的混淆工具。工具的主要功能OC、C++、Swift已封装成Mac应用,其他功能还在封装中,敬请期待。马甲包的本质:阶段一减低重复率,本人开发初期的版本和目前市面上的其......
  • Go 语言中 sync.Mutex 的实现
    锁的获取和释放模式先理解两种不同的锁的获取和释放模式"Barging"和"Handoff",它们影响着等待锁的goroutines的行为。Barging(插队)在Barging模式下,当一个锁被释放时,任何尝试获取该锁的goroutine都有机会立即抢占("插队")并尝试获取锁,而不管是否有其他goroutines正在等待......
  • Sparse稀疏检索介绍与实践
    Sparse稀疏检索介绍在处理大规模文本数据时,我们经常会遇到一些挑战,比如如何有效地表示和检索文档,当前主要有两个主要方法,传统的文本BM25检索,以及将文档映射到向量空间的向量检索。BM25效果是有上限的,但是文本检索在一些场景仍具备较好的鲁棒性和可解释性,因此不可或缺,那么在NN模......
  • BinGoo系列之Socket组件《三、客户端+服务端组件的封装》 控件版(转)
    简介:继【C#原生Socket网络通讯】BinGoo系列之Socket服务端+客户端 之后,进一步封装的原生socket网络通讯组件。在此之前的版本还是要写一部分绑定委托事件代码,新版通讯类库将所有的消息机制全部封装成事件。只需拖动组件至窗体,直接双击组件注册事件,无需再写有关socket的代码,......
  • centos7安装golang最新版1.21.1
    #先卸载旧的golangyumremovegolang#然后找到最新版本https://golang.google.cn/dl/#下载安装cd/usr/local/src wgethttps://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gztar-zxvfgo1.21.1.linux-amd64.tar.gz-C/usr/local/#增加配置文件vim/etc/profi......