首页 > 其他分享 >requests:一个比net/http包更简洁、高效的开源包

requests:一个比net/http包更简洁、高效的开源包

时间:2023-06-08 09:36:18浏览次数:58  
标签:http err nil requests net 请求

今天给大家推荐一个高效的HTTP的请求包:carlmjohnson/requests。项目地址是:https://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包利用“封装”的思想,将复杂的处理操作封装到函数中,一是避免调用者编写重复的代码,提高效率;二是能够减少调用者出错的概率。在实际研发中,我们也可以借鉴其思想,将常用的操作封装起来,从而提高研发效率。

标签:http,err,nil,requests,net,请求
From: https://www.cnblogs.com/cheyunhua/p/17465222.html

相关文章

  • 1.7Mininet多数据中心网络拓扑流量带宽实验
    Mininet多数据中心网络拓扑流量带宽实验实验目的1、掌握多数据中心网络拓扑的构建。2、熟悉网络性能测试工具Iperf,根据实验测试SDN网络的性能。实验环境Mininet多数据中心网络拓扑流量带宽实验的拓扑如下图所示。设备名称软件环境硬件环境主机Ubuntu14.04桌面......
  • 1.6Mininet流表应用实战2——控制器下发流表协议分析
    Mininet流表应用实战2——控制器下发流表协议分析实验目的1、理解OpenFlow交换机和控制器间的工作原理。2、学会使用Wireshark抓包分析,熟悉了解OpenFlow协议。。实验环境Mininet流表应用实战2——控制器下发流表协议分析实验的拓扑如下图所示。实验环境信息如下表所示。......
  • .Net 6使用Hangfire(二)
    本文主要介绍如何使用已配置好的HangFire来执行作业调度。1、Fire-and-forget即发即弃立即调用作业并且只执行一次;当我们调用Hangfire.BackgroundJob.Enqueue的时候,并不是立即调用传入的方法,它会执行以下的几个步骤:①把作业信息(传入的方法和方法参数)进行序列化;②基于序列化......
  • 【Netty】02-入门
    二.Netty入门1.概述1.1Netty是什么?Nettyisanasynchronousevent-drivennetworkapplicationframeworkforrapiddevelopmentofmaintainablehighperformanceprotocolservers&clients.Netty是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、......
  • 机器学习-头饰20类-图像分类,头饰图像分类-Resnet50
    (一).选题背景:什么是图像分类?它有哪些应用场合?图像分类任务是计算机视觉中的核心任务,其目标是根据图像信息中所反映的不同特征,把不同类别的图像区分开来。从已知的类别标签集合中为给定的输入图片选定一个类别标签。它的难点在于:跨越“语义鸿沟”建立像素到语义的映射。还有就是......
  • BLINNET - Bytelandian Blingors Network
    传送门:BLINNET-BytelandianBlingorsNetwork通过读题,不难发现,把这些点连接起来的最小成本,岂不是最小生成树?现在先思考一下给出的城市名字需要如何处理?其实直接按照输入顺序标号就好了!跑一遍最小生成树即可,注意多测清空。处理最小生成树的策略是,把边按照成本从小到大排序,每......
  • 每个 ASP.NET 开发人员都应该知道的 IIS 管道中的 HTTP 请求生命周期事件
    原文:https://www.dotnetcurry.com/aspnet/747/http-request-lifecycle-events-iis-pipeline-aspnet......
  • .net低代码开发平台 快速实现组织架构数字化
    在数字化时代,企业面临着巨大的转型挑战。数字化赋予了企业极大的流程优化和高效性,提供了以前难以想象的效率。数字化让企业可以通过机器学习、大数据、自动化流程等手段,实现更快、更精确的决策和反应性。其中,企业组织架构数字化尤为重要。数字化转型是企业的整体转型,是对企业业务......
  • 3D UX-net 训练记录
    3DUX-net训练记录题外话:如果自己跑过nnunet或者其他模型的大佬会更容易上手,但是对于第一次跑模型的小白来说,这个模型也是很好上手和跑通的!本人就是小白,这是我跑通的第一个模型。首先先去官网下载所需的代码和论文(跑之前可以先不看论文,我就是)官网:GitHub-MASILab/3DUX-Net......
  • harbor配置https
    1、首先需要准备好ssl证书,没有安全的ssl证书的话,可以用openssl配置harbor自签名证书生成CA证书私钥:opensslgenrsa-outca.key40962、生成CA证书(有两种配置,域名或者IP两种方式,下边分别说明)域名方式:opensslreq-x509-new-nodes-sha512-days3650\-subj"/C=CN/ST=Beijing......