ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go 标准库之 GoRequests 介绍与基本使用 [打印本页]

作者: 道家人    时间: 2024-5-17 10:25
标题: 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库,你需要先在你的Go情况中安装它。通过下面的下令即可完成安装:
  1. go get -u github.com/levigross/grequests
复制代码
三、导入

在安装完Grequests后,你可以通过import语句把它引入到你的Go代码中:
  1. import "github.com/levigross/grequests"
复制代码
四、基本使用

4.1 发送GET 请求

下面是一个发送GET请求的示例,此中演示了如何获取HTTP响应并打印出来:
  1. func Get() {
  2.         resp, err := grequests.Get("http://127.0.0.1:8080/book/", nil)
  3.         if err != nil {
  4.                 log.Fatalln("Unable to make request: ", err)
  5.         }
  6.         if !resp.Ok {
  7.                 log.Fatalln("请求超时!")
  8.         }
  9.         // 解析响应的JSON数据
  10.         var data []map[string]interface{}
  11.         if err := resp.JSON(&data); err != nil {
  12.                 log.Fatalln("Unable to parse JSON response: ", err)
  13.         }
  14.         fmt.Println(data)
  15. }
复制代码
上面的代码首先使用Get方法发送GET请求,然后查抄是否有错误发生。如果没有错误,就可以通过resp.Json()方法获取响应的文本内容。
4.2 POST请求发送JSON数据

在下面的例子中,我们创建了一个map对象来保存我们想要发送的JSON数据。然后我们通过ROption创建了一个请求选项对象,并在此中指定了JSON为发送的数据类型。最后,我们调用Post方法来发送请求:
  1. func Post() {
  2.         postData := map[string]string{
  3.                 "id":   "1",
  4.                 "name": "Go入门到进阶",
  5.         }
  6.         geq := &grequests.RequestOptions{
  7.                 JSON: postData,
  8.         }
  9.         resp, err := grequests.Post("http://127.0.0.1:8080/book/create", geq)
  10.         if err != nil {
  11.                 log.Fatalln("Unable to make request: ", err)
  12.         }
  13.         fmt.Println(resp.String())
  14. }
复制代码
下面是代码的逐行解释:
4.3 Post 文件上传

文件上传同样简朴。你可以通过RequestOptions指定文件:
  1. func UploadFile() {
  2.         // 允许您通过指定磁盘上的位置来创建FileUpload结构片
  3.         // 打开要上传的文件
  4.         file, err := os.Open("./go.mod")
  5.         if err != nil {
  6.                 log.Fatalln("Unable to open file: ", err)
  7.         }
  8.         defer file.Close()
  9.         // 创建FileUpload结构片
  10.         ro := &grequests.RequestOptions{
  11.                 Files: []grequests.FileUpload{{
  12.                         FileName:     "1.txt", // 上传后的文件名称
  13.                         FieldName:    "file",  // 上传文件对应字段
  14.                         FileContents: file, // 使用文件内容作为FileContents
  15.                 }},
  16.         }
  17.         // 发送POST请求
  18.         resp, err := grequests.Post("http://127.0.0.1:8080/book/upload/", ro)
  19.         if err != nil {
  20.                 log.Fatalln("Unable to make request: ", err)
  21.         }
  22.         fmt.Println(resp.String())
  23. }
复制代码
在上述代码中,我们创建了一个FileUpload布局,通过FileName、FieldName和FileContents来指定我们要上传的文件详情。
4.4 GoRequests 使用署理

gorequest署理,下面是一个简朴的例子,需要把Proxies中的URL添加为*url.URL署理:
  1. func Proxy() {
  2.         // 代理服务器
  3.         const proxyServer = "http-pro.xxx.com:9010"
  4.         // 代理隧道验证信息
  5.         const proxyUser = "xxxxxxxxx"
  6.         const proxyPass = "xxxxxxxxx"
  7.         // 初始化代理URL
  8.         proxyUrl, _ := url.Parse("http://" + proxyUser + ":" + proxyPass + "@" + proxyServer)
  9.         // 创建请求选项
  10.         ro := &grequests.RequestOptions{
  11.                 Proxies: map[string]*url.URL{
  12.                         "http": proxyUrl,
  13.                 },
  14.                 Headers: map[string]string{
  15.                         "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",
  16.                 },
  17.         }
  18.         // 发起GET请求
  19.         resp, err := grequests.Get("http://www.example.com", ro)
  20.         if err != nil {
  21.                 fmt.Println("Error:", err)
  22.                 return
  23.         }
  24.         // 打印响应状态码
  25.         fmt.Println("Status code:", resp.StatusCode)
  26.         // 打印响应体
  27.         fmt.Println("Response:", resp.String())
  28. }
复制代码
下面是代码的逐行解释:
4.5 Gorequests 使用session

下面是使用Session的一个例子:
  1. session := grequests.Session{
  2.                 RequestOptions: &grequests.RequestOptions{
  3.                         Headers: map[string]string{
  4.                                 "authority":  "mp3.haoge500.com",
  5.                                 "referer":    "https://www.zz123.com/",
  6.                                 "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",
  7.                         },
  8.                 },
  9.         }
复制代码
五、HTTP服务端代码
  1. package main
  2. import (
  3.         "encoding/json"
  4.         "github.com/gin-gonic/gin"
  5.         "net/http"
  6.         "os"
  7. )
  8. type Book struct {
  9.         ID   string `json:"id"`
  10.         Name string `json:"name"`
  11. }
  12. type BookHandler struct {
  13. }
  14. func (b *BookHandler) RegisterRoutes(server *gin.Engine) {
  15.         bg := server.Group("/book")
  16.         bg.POST("/upload", b.Upload)
  17.         bg.POST("/create", b.Create)
  18.         bg.GET("/", b.GetAllBooks) // 查询书籍
  19. }
  20. func (b *BookHandler) Upload(ctx *gin.Context) {
  21.         // 从请求中获取文件
  22.         file, err := ctx.FormFile("file")
  23.         if err != nil {
  24.                 ctx.JSON(http.StatusBadRequest, gin.H{"error": "无法获取上传的文件"})
  25.                 return
  26.         }
  27.         // 将文件保存到服务器
  28.         // 注意:这里需要确保保存文件的目录存在,并且服务器有写入权限
  29.         savePath := "./uploads/" + file.Filename
  30.         if err := ctx.SaveUploadedFile(file, savePath); err != nil {
  31.                 ctx.JSON(http.StatusInternalServerError, gin.H{"error": "文件保存失败"})
  32.                 return
  33.         }
  34.         ctx.JSON(http.StatusOK, gin.H{"message": "文件上传成功"})
  35. }
  36. func (b *BookHandler) Create(ctx *gin.Context) {
  37.         var req Book
  38.         if err := ctx.Bind(&req); err != nil {
  39.                 return
  40.         }
  41.         // 将新的书籍数据保存到data.json文件中
  42.         if err := addBookToFile(&req); err != nil {
  43.                 ctx.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save book data"})
  44.                 return
  45.         }
  46.         ctx.JSON(http.StatusOK, gin.H{"message": "Book added successfully"})
  47. }
  48. func (b *BookHandler) GetAllBooks(c *gin.Context) {
  49.         // 从data.json文件中读取书籍数据
  50.         books, err := getBooksFromFile()
  51.         if err != nil {
  52.                 c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read book data"})
  53.                 return
  54.         }
  55.         // 获取URL查询参数中的id
  56.         id := c.Query("id")
  57.         // 如果提供了ID,查找具有匹配ID的书籍列表
  58.         if id != "" {
  59.                 // 查找具有匹配ID的书籍
  60.                 var foundBooks []Book
  61.                 for _, book := range books {
  62.                         if book.ID == id {
  63.                                 foundBooks = append(foundBooks, book)
  64.                         }
  65.                 }
  66.                 // 如果找到了匹配的书籍,返回这些书籍
  67.                 if len(foundBooks) > 0 {
  68.                         c.JSON(http.StatusOK, foundBooks)
  69.                         return
  70.                 }
  71.                 // 如果没有找到匹配的书籍,返回404
  72.                 c.JSON(http.StatusNotFound, gin.H{"error": "Books not found"})
  73.                 return
  74.         }
  75.         // 如果没有提供ID,返回所有书籍
  76.         c.JSON(http.StatusOK, books)
  77. }
  78. func addBookToFile(book *Book) error {
  79.         // 读取现有的data.json文件内容
  80.         var books []Book
  81.         data, err := os.ReadFile("data.json")
  82.         if err != nil && !os.IsNotExist(err) {
  83.                 return err
  84.         }
  85.         // 如果文件存在,解析现有的书籍数据
  86.         if err == nil {
  87.                 if err := json.Unmarshal(data, &books); err != nil {
  88.                         return err
  89.                 }
  90.         }
  91.         // 将新的书籍添加到数组中
  92.         books = append(books, *book)
  93.         // 将更新后的书籍数组序列化为JSON
  94.         newData, err := json.MarshalIndent(books, "", "    ")
  95.         if err != nil {
  96.                 return err
  97.         }
  98.         // 将序列化的JSON数据写入data.json文件
  99.         if err := os.WriteFile("data.json", newData, 0644); err != nil {
  100.                 return err
  101.         }
  102.         return nil
  103. }
  104. func getBooksFromFile() ([]Book, error) {
  105.         // 读取data.json文件内容
  106.         data, err := os.ReadFile("data.json")
  107.         if err != nil {
  108.                 return nil, err
  109.         }
  110.         // 解析JSON数据到书籍数组中
  111.         var books []Book
  112.         if err := json.Unmarshal(data, &books); err != nil {
  113.                 return nil, err
  114.         }
  115.         return books, nil
  116. }
  117. func InitWebServer(bookHandler *BookHandler) *gin.Engine {
  118.         server := gin.Default()
  119.         bookHandler.RegisterRoutes(server)
  120.         return server
  121. }
  122. func main() {
  123.         // 确保上传目录存在
  124.         os.MkdirAll("./uploads", 0755)
  125.         bookHandler := &BookHandler{}
  126.         server := InitWebServer(bookHandler)
  127.         server.Run(":8080") // 在8080端口启动服务器
  128. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4