详解Golang中Requests包的使用

 更新时间:2023年06月08日 09:47:28   作者:Go学堂  
Go的net/http包虽然功能强大、用途也广告,但要想正确的使用请求的客户端是非常繁琐的,所以本文和大家分享一个高效的HTTP的请求包carlmjohnson/requests的使用,需要的小伙伴可以了解一下

今天给大家推荐一个高效的HTTP的请求包:carlmjohnson/requests。项目地址是:github.com/carlmjohnson/requests

该包诞生的背景

作者在自己的博客中描述了自己为什么写这个request包。作者这样描述go的net/http包:

Go的net/http包虽然功能强大、用途也广告,但要想正确的使用请求的客户端是非常繁琐的

我们看下go的net/http包在发送一个web请求时有哪些繁琐的地方。以下是使用标准的net/http包发送请求的一个示例:

func GetFoo() (*T, error) {
  res, err := http.Get("http://foo/t.json")
  if err != nil {
    return nil, err
  }
  t := new(T)
  if err := json.NewDecoder(res.Body).Decode(t); err != nil {
    return nil, err
  }
  return t, nil
}

这段代码有如下问题:

  • 没有调用Response.Body.Close关闭连接
  • 没有检查响应返回的状态值
  • 响应值是字节切片,没有做对应的结构转换

这会导致正确使用GetFoo函数应该看起来像下面这样:

func GetFoo(ctx context.Context) (*T, error) {
  req, err := http.NewRequest("GET", "http://foo/t.json", nil)
  if err != nil {
    return nil, err
  }
  req = req.WithContext(ctx)
  res, err := http.DefaultClient.Do(req)
  if err != nil {
     return nil, err
  }
  defer res.Body.Close()
  if res.StatusCode < 200 || res.StatusCode > 299 {
     return nil, fmt.Errorf("bogus status: got %v", res.Status)
  }
  t := new(T)
  if err := json.NewDecoder(res.Body).Decode(t); err != nil {
     return nil, err
  }
  return t, nil
}

就是要增加对Context的支持、关闭Response.Body、检查响应的返回值以及对响应值转换成json(或其他格式)。

所以,作者才写了自己的requests库,目的是要让http的请求不再繁琐。

Requests包的使用

基于以上问题,requests包就诞生了。该包通过将发送请求时的所有必要信息都抽象成了Builder结构体,通过该结构体来构建、发送和处理HTTP的请求。并且还支持链式操作。

下面我们看一些具体的请求示例。

Get请求,响应结果解析成字符串

如下,是发送Get的请求。使用requests包发送Get请求只需要5行代码,而原生的net/http包得需要11多行代码。

Post请求

如下,是一个发送Post的请求。使用requests包只用了5行代码,而原生的net/http包需要12多行代码。

将Get请求的JSON结果转换成结构体

如下,是Get请求的JSON响应结果解析成对应的结构体。使用requests包只用了7行代码,而使用原生的net/http包需要使用18多行代码。

发送Body是JSON的Post请求

将JSON请求体以POST方式发送的代码也很简洁,如下:

实现原理

该包实现的原理是利用了封装的思想。将复杂的操作封装到函数中,对外暴露接口供使用者调用。

在requests包中,最核心的是是一个Builder的结构。该结构体将请求的URL、请求的参数、http的客户端以及响应结果处理函数都封装在这里该结构体中。如下:

  • urlBuilder结构体的功能是构造请求的URL
  • requestBuilder结构体的功能是构造请求头、cookie、请求方法等信息
  • http.Client是http请求的客户端
  • ResponseHandler结构体的功能是处理请求的响应值。

下图是ResjponseHandler结构体处理响应值的函数实现。能处理成JSON、文件、HTML等多种格式。

总结

requensts包利用“封装”的思想,将复杂的处理操作封装到函数中,一是避免调用者编写重复的代码,提高效率;二是能够减少调用者出错的概率。在实际研发中,我们也可以借鉴其思想,将常用的操作封装起来,从而提高研发效率。

到此这篇关于详解Golang中Requests包的使用的文章就介绍到这了,更多相关Golang Requests包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go Context库 使用基本示例

    Go Context库 使用基本示例

    在Go的http包中,每个请求由独立的goroutine处理,这些goroutine可能需要访问请求特定的数据或启动其他服务,Context在Go语言中提供了一种方式来传递请求域的数据、取消信号和截止时间,本文介绍Go Context库 使用基本示例,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • gin项目部署到服务器并后台启动的步骤

    gin项目部署到服务器并后台启动的步骤

    本文主要介绍了gin项目部署到服务器并后台启动的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go下载安装及切换不同版本的实现方法

    Go下载安装及切换不同版本的实现方法

    本文详细介绍了如何下载和安装Go语言,以及如何切换不同版本的Go,通过提供详细的步骤和解释,帮助读者理解Go语言的安装和版本管理
    2024-12-12
  • Golang捕获panic堆栈信息的讲解

    Golang捕获panic堆栈信息的讲解

    今天小编就为大家分享一篇关于Golang捕获panic堆栈信息的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 一文带你掌握掌握 Golang结构体与方法

    一文带你掌握掌握 Golang结构体与方法

    在 Golang 中,结构体和方法是实现面向对象编程的重要组成部分,也是 Golang 的核心概念之一。在本篇文章中,我们将深入介绍 Golang 结构体与方法的概念、使用方法以及相关的编程技巧和最佳实践
    2023-04-04
  • GO语言异常处理机制panic和recover分析

    GO语言异常处理机制panic和recover分析

    这篇文章主要介绍了GO语言异常处理机制panic和recover,分析了捕获运行时发生错误的方法,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • golang常用库之操作数据库的orm框架-gorm基本使用详解

    golang常用库之操作数据库的orm框架-gorm基本使用详解

    这篇文章主要介绍了golang常用库之操作数据库的orm框架-gorm基本使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • go实现Redis读写分离示例详解

    go实现Redis读写分离示例详解

    本篇文章将介绍Redis通信协议RESP, 而后在使用go来编写一个中间件,从而来完成Redis读写分离,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • golang 随机数的两种方式

    golang 随机数的两种方式

    本文主要介绍了golang 随机数的两种方式,一种是伪随机,另一种是真随机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 详解Go 中的时间处理

    详解Go 中的时间处理

    这篇文章主要介绍了Go 中的时间处理,本文将介绍 time 库中一些重要的函数和方法,希望能帮助到那些一遇到 Go 时间处理问题就需要百度的童鞋,需要的朋友可以参考下
    2022-07-07

最新评论