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

这篇具有很好参考价值的文章主要介绍了Go 标准库之 GoRequests 介绍与基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 一、介绍
  • 二、安装
  • 三、导入
  • 四、基本使用
    • 4.1 发送GET 请求
    • 4.2 POST请求发送JSON数据
    • 4.3 Post 文件上传
    • 4.4 GoRequests 使用代理
    • 4.5 Gorequests 使用session
  • 五、HTTP服务端代码

一、介绍

官方文档 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的一个例子:文章来源地址https://www.toymoban.com/news/detail-852589.html

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",
			},
		},
	}

五、HTTP服务端代码

package main

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
)

type Book struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

type BookHandler struct {
}

func (b *BookHandler) RegisterRoutes(server *gin.Engine) {
	bg := server.Group("/book")
	bg.POST("/upload", b.Upload)
	bg.POST("/create", b.Create)
	bg.GET("/", b.GetAllBooks) // 查询书籍
}

func (b *BookHandler) Upload(ctx *gin.Context) {
	// 从请求中获取文件
	file, err := ctx.FormFile("file")
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无法获取上传的文件"})
		return
	}

	// 将文件保存到服务器
	// 注意:这里需要确保保存文件的目录存在,并且服务器有写入权限
	savePath := "./uploads/" + file.Filename
	if err := ctx.SaveUploadedFile(file, savePath); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": "文件保存失败"})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"message": "文件上传成功"})
}

func (b *BookHandler) Create(ctx *gin.Context) {
	var req Book
	if err := ctx.Bind(&req); err != nil {
		return
	}

	// 将新的书籍数据保存到data.json文件中
	if err := addBookToFile(&req); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save book data"})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"message": "Book added successfully"})
}
func (b *BookHandler) GetAllBooks(c *gin.Context) {
	// 从data.json文件中读取书籍数据
	books, err := getBooksFromFile()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read book data"})
		return
	}

	// 获取URL查询参数中的id
	id := c.Query("id")

	// 如果提供了ID,查找具有匹配ID的书籍列表
	if id != "" {
		// 查找具有匹配ID的书籍
		var foundBooks []Book
		for _, book := range books {
			if book.ID == id {
				foundBooks = append(foundBooks, book)
			}
		}
		// 如果找到了匹配的书籍,返回这些书籍
		if len(foundBooks) > 0 {
			c.JSON(http.StatusOK, foundBooks)
			return
		}
		// 如果没有找到匹配的书籍,返回404
		c.JSON(http.StatusNotFound, gin.H{"error": "Books not found"})
		return
	}

	// 如果没有提供ID,返回所有书籍
	c.JSON(http.StatusOK, books)
}
func addBookToFile(book *Book) error {
	// 读取现有的data.json文件内容
	var books []Book
	data, err := os.ReadFile("data.json")
	if err != nil && !os.IsNotExist(err) {
		return err
	}

	// 如果文件存在,解析现有的书籍数据
	if err == nil {
		if err := json.Unmarshal(data, &books); err != nil {
			return err
		}
	}

	// 将新的书籍添加到数组中
	books = append(books, *book)

	// 将更新后的书籍数组序列化为JSON
	newData, err := json.MarshalIndent(books, "", "    ")
	if err != nil {
		return err
	}

	// 将序列化的JSON数据写入data.json文件
	if err := os.WriteFile("data.json", newData, 0644); err != nil {
		return err
	}

	return nil
}
func getBooksFromFile() ([]Book, error) {
	// 读取data.json文件内容
	data, err := os.ReadFile("data.json")
	if err != nil {
		return nil, err
	}

	// 解析JSON数据到书籍数组中
	var books []Book
	if err := json.Unmarshal(data, &books); err != nil {
		return nil, err
	}

	return books, nil
}

func InitWebServer(bookHandler *BookHandler) *gin.Engine {
	server := gin.Default()
	bookHandler.RegisterRoutes(server)
	return server
}

func main() {
	// 确保上传目录存在
	os.MkdirAll("./uploads", 0755)

	bookHandler := &BookHandler{}
	server := InitWebServer(bookHandler)
	server.Run(":8080") // 在8080端口启动服务器
}

到了这里,关于Go 标准库之 GoRequests 介绍与基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【GoLang】Go语言几种标准库介绍(一)

    前言 随着计算机科学的迅猛发展,编程语言也在不断涌现。 在这个多样化的编程语言生态系统中,Go语言凭借其简洁、高效、并发支持等特性逐渐崭露头角。 作为一门开源的静态编程语言,Go语言自带了丰富的标准库,为开发者提供了强大的工具和功能。 本文将深入介绍G

    2024年02月04日
    浏览(65)
  • 【GoLang】Go语言几种标准库介绍(二)

    前言 上一篇,我们介绍了 bufio (buffered I/O)库和 bytes 库 ,这篇我们继续介绍剩下的库 几种库 container 库 (封装堆、列表和环形列表等容器) container 包并不是一个独立的包,而是包含了一些子包,如 container/list 、 container/heap 等,用于实现不同类型的容器数据结构。这些数据

    2024年02月04日
    浏览(61)
  • 【GoLang入门教程】Go语言几种标准库介绍(五)

    前言 上一篇,我们介绍了fmt、Go、html 三个库,这篇我们继续介绍剩下的库 几种库 image库 (常见图形格式的访问及生成) 在 Go 语言的标准库中, image 包提供了对图像的基本操作和处理功能。 这个包定义了 Image 接口和一些基本的图像类型,同时也包含了一些实现了该接口的具

    2024年02月03日
    浏览(73)
  • 【GoLang入门教程】Go语言几种标准库介绍(六)

    前言 上一篇,我们介绍了image、IO、math三个库,这篇我们继续介绍剩下的库 几种库 Net库 (网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等) 在 Go 语言的标准库中, net 包提供了对网络操作的支持,包括基本的网络协议、Socket 编程、HTTP 客户端和服务器等。 net 包包含多个子包,其

    2024年02月02日
    浏览(62)
  • 【GoLang入门教程】Go语言几种标准库介绍(四)

    前言 上一篇,我们介绍了debug、encoding、flag三个库,这篇我们继续介绍剩下的库 几种库 fmt库 (格式化操作) 在 Go 语言的标准库中, fmt 包提供了格式化输入输出的功能。 这个包包括了一系列函数,用于将数据格式化为字符串( fmt.Sprintf )、输出到控制台( fmt.Print 、 fmt.Pri

    2024年02月03日
    浏览(106)
  • 【GoLang入门教程】Go语言几种标准库介绍(八)

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 前言 上一篇,我们介绍了plugin、reflect、regexp三个库,这篇我们继续介绍剩下的库 几种库 runtime库 ( 运行时接口) 在 Go 语言的标准库中, runtime 包

    2024年01月19日
    浏览(66)
  • 【GoLang入门教程】Go语言几种标准库介绍(七)

    前言 上一篇,我们介绍了Net、OS、path三个库,这篇我们继续介绍剩下的库 几种库 plugin库 (Go 1.7 加入的插件系统。支持将代码编译为插件,按需加载) 在 Go 语言的标准库中, plugin 包提供了对 Go 插件的支持。 插件是一种在运行时加载并与主程序交互的机制,允许程序在不重新

    2024年01月16日
    浏览(87)
  • 7天玩转 Golang 标准库之 http/net

    在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。 首先,我们来看看如何使用net/http标准库发送一个HTTP请求。net/http库中的 http.Get 函数

    2024年02月04日
    浏览(51)
  • Go开始:Go基本元素介绍

    本文深入探讨了Go编程语言中的核心概念,包括标识符、、具名函数、具名值、定义类型、类型别名、包和模块管理,以及代码块和断行。这些元素是构成Go程序的基础,也是编写高质量代码的关键。 关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥

    2024年02月10日
    浏览(46)
  • F407标准库之定时器触发AD转换

    关于ADC转换,正点原子的标准库开发中讲的是:软件触发一次转换,然后获取一个数据,没提及外部触发,也没提及ADC中断。 如果要多次读取数据,可以通过循环+延时来实现。 这种情况就是通过多次调用,轮询读取。 其实,可以结合定时器来触发ADC转换,然后在ADC中断函数

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包