异步http接口调用库:httpx

谈到http接口调用,Requests大家并不陌生,例如,robotframework-requests、HttpRunner等HTTP接口测试库/框架都是基于它开发。这里将介绍另一款http接口测试框架:httpx。

它的API和Requests高度一致。

github: GitHub - encode/httpx: A next generation HTTP client for Python. 🦋

安装:

> pip install httpx

httpx 简单使用

当然,它是不支持python2.x的。

  • 简单的get调用
import httpx
 
r = httpx.get("http://httpbin.org/get")
print(r.status_code)
print(r.json())

执行结果:

200
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-httpx/0.12.1', 'X-Amzn-Trace-Id': 'Root=1-5ea5b58c-e446c44392ea090809e8a4bc'}, 'origin': '113.97.33.224', 'url': 'http://httpbin.org/get'}
  • 带参数的post调用
import httpx
 
payload = {'key1': 'value1', 'key2': 'value2'}
r = httpx.post("http://httpbin.org/post", data=payload)
print(r.json())

执行结果:

{'args': {}, 'data': '', 'files': {}, 'form': {'key1': 'value1', 'key2': 'value2'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '23', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-httpx/0.12.1', 'X-Amzn-Trace-Id': 'Root=1-5ea5b61d-1871d10e80b8324e48ea475e'}, 'json': None, 'origin': '113.97.33.224', 'url': 'http://httpbin.org/post'}

你会发现这几乎和requests一模一样,只不过把requests 换成了httpx。

httpx 异步调用

接下来认识httpx的异步调用:

import httpx
import asyncio
 
 
async def main():
    async with httpx.AsyncClient() as client:
        resp = await client.get('http://httpbin.org/get')
        result = resp.json()
        print(result)
 
 
asyncio.run(main())

这里用到了async 、await, asyncio等,等参考我关于python异步I/O的基础介绍:https://www.cnblogs.com/fnng/p/12757395.html

异步的调用的优势
我们发现,采用异步会让接口的调用更加复杂,那为什么还要使用异步呢?当你要调用1000次接口时,那么异步调用可以让你的调用更快。接下来我们通过简单让例子进行对比。

以我flask开发的简单接口为例子:

GitHub - defnngj/learning-API-test: learning API test

为了测试的更加准确性,我将flask服务部署在了另一台电脑,测试机与被测服务分离。

  • httpx 同步调用
# 同步调用
import time
import httpx
 
 
def make_request(client):
    resp = client.get('http://192.168.0.7:5000')
    result = resp.json()
    # print(result)
    assert result["code"] == 10200
 
def main():
    session = httpx.Client()
 
    # 1000 次调用
    for _ in range(1000):
        make_request(session)
 
 
if __name__ == '__main__':
    # 开始
    start = time.time()
    main()
    # 结束
    end = time.time()
    print(f'同步:发送1000次请求,耗时:{end - start}')

结果:

...
同步:发送1000次请求,耗时:52.948561906814575
  • httpx 异步调用
# 异步调用
import httpx
import asyncio
import time
 
async def request(client):
    resp = await client.get('http://192.168.0.7:5000')
    result = resp.json()
    # print(result)
    assert result["code"] == 10200
 
 
async def main():
    async with httpx.AsyncClient() as client:
        # # 开始
        # start = time.time()
 
        # 1000 次调用
        task_list = []
        for _ in range(1000):
            req = request(client)
            task = asyncio.create_task(req)
            task_list.append(task)
        await asyncio.gather(*task_list)
 
 
if __name__ == "__main__":
    #开始
    start = time.time()
    asyncio.run(main())
    # 结束
    end = time.time()
    print(f'异步:发送1000次请求,耗时:{end - start}')

结果:

...
异步:发送1000次请求,耗时:3.903275728225708

将httpx用于请求端,同步与异步请求差距非常明显。

以上的例子已经放到 learning-API-test github项目

总结
* 这里只是拿 flask 非异步框架做为接口服务端进行对比,如果如果将接口服务同样换作前面介绍的 snaic 异步框架,上面的两组测试对比并不明显(snaic的异步接口服务处理同步请求更快),在安装 snaic的时候会发现,他同样也集成了 httpx 库。

* 为什么要学习异步,因为我们公司有很多接口是异步调用的,所以,我想真正搞懂这个概念,就这么简单!保持在工作中对技术的好奇心。

异步与多线程的区别?这是我在学习 异步时候的一个疑问,我找到了一个比较形象的例子。

以火车站购票场景为例:一个火车站为一个进程,一个窗口和售票员的组合为一个线程:

多线程:火车站开了N个窗口售票员,我们去买票,会有工作人员(CPU)指定我们去某个窗口买票,你被安排到某个窗口后,告诉售票员你的请求(咨询或买票),售票员执行操作,如果这个过程中发送的阻塞,也是窗口售票员的阻塞(比如查票的过程),但是因为你开了很多个窗口,其他买票的人可以被安排去另外的空闲窗口,如果所有窗口都满了,工作人员就不会给你安排了,直到有空的窗口出来;
多进程(并行):建多个火车站售票,火车站与火车站间互不影响,看买票的自己想去哪里(这里不讨论负载均衡);
异步:火车站只有一个窗口售票员,但是窗口前有一个登记台(事件循环),你把你想买的票告诉给登记台,并留下你的手机(回调函数),然后你就可以走了,由于登记台只是登记了你的请求,并没有做任何其他操作,所以这个耗时基本忽略不计的。之后售票员处理完了上一个任务了,就会自己去登记台取剩下的未完成的任务,直到取到你的任务,操作完后,有票没票都会通过手机通知你,如果有票还会往你的手机发车票的二维码;

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

 

文档获取方式:

加入我的软件测试交流群:1007119548免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/295333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

StreamPark + PiflowX 打造新一代大数据计算处理平台

🚀 什么是PiflowX PiFlow 是一个基于分布式计算框架 Spark 开发的大数据流水线系统。该系统将数据的采集、清洗、计算、存储等各个环节封装成组件,以所见即所得方式进行流水线配置。简单易用,功能强大。它具有如下特性: 简单易用…

群晖Docker部署HomeAssistant容器结合内网穿透远程控制家中智能设备

目录 一、下载HomeAssistant镜像 二、内网穿透HomeAssistant,实现异地控制智能家居 三、使用固定域名访问HomeAssistant 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站 Ho…

树低级(C语言版)

一.树基本计算规则 关于树的大部分知识点我们都讲过了,那么如果我给你树的节点,你可以算出叶子节点个数吗? 下面我们总结下一些计算规则: 1.父子计算规则: parent(child-1)/2; leftchildparent*21,rightchildpare…

设计循环队列——oj题622

. 个人主页:晓风飞 专栏:LeetCode刷题|数据结构|Linux 路漫漫其修远兮,吾将上下而求索 文章目录 题目要求:应该支持如下操作:示例:提示: 结构体定义队列的创建基本操作判断队列是否为空&#xf…

python 数据容器

数据容器概念 一个可以存储多个元素的python数据类型 python有的数据容器 list(列表) tuple(元组) str(字符串) set(集合) dct(字典) 列表 python的列表的数据类型可以是不同的 my_list ["1",123,True,[123,"3333",d,False]]for item in my_list:p…

第三部分使用脚手架:vue学习(61-65)

文章目录 61 创建vue脚手架![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f71d4324be0542209e690ab9e886d199.png)62 分析脚手架结构63 render函数64 修改默认配置65 ref 属性 61 创建vue脚手架 写完vue文件,没有脚手架做翻译,浏览器不认识…

数据结构:图详解

图的存储方式 邻接矩阵 首先先创建图,这一个我们可以使用邻接矩阵或者邻接链 表来进行存储,我们要实现的无向图的创建,我们先创建 一个矩阵尺寸为n*n,n为图中的节点个数如图所示 可以看出图中有5个结点,那我们创建…

PostGIS学习教程十七:线性参考

PostGIS学习教程十七:线性参考 线性参考是一种表示要素的方法,这些要素可以通过引用一个基本的线性要素来描述。使用线性参照建模的常见示例包括: 公路资产,这些资产使用公路网络沿线的英里来表示。 道路养护作业,指…

AOP(面向切面编程)基于XML方式配置

概念解释:(理解基本概念方可快速入手) 连接点(joinpoint) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法。 切入点(pointcut&#x…

主题-----读微信公众号

1.SOA 面向服务的架构(Service-Oriented Architecture,SOA)还没有一个公认的定义。许多组织从不同的角度和不同的侧面对 SOA 进行了描述,较为典型的有以下三个: (1)W3C 的定义:SOA 是…

MySQL-DCL

DCL是数据控制语言,用来管理数据库用户,控制数据库的访问权限。 管理用户:管理哪些用户可以访问哪些数据库 1.查询用户 USE mysql; SELECT * FROM user; 注意: MySQL中用户信息和用户的权限信息都是记录在mysql数据库的user表中的…

D-Link DES-108 交换机

D-Link DES-108 交换机 1. 百兆交换机 8 口References ​ D-Link Corporation is a Taiwanese multinational networking equipment manufacturing corporation headquartered in Taipei, Taiwan. Taiwanese:adj. 台湾的 n. 台湾人 headquarter [hedkwɔ:tə]&#…

深入理解Python中的二分查找与bisect模块

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

数据采集:获取有价值信息的关键步骤

在当今数据驱动的时代,数据已成为企业、组织和个人做出明智决策的重要依据。而数据采集作为数据分析和应用的第一步,其重要性不言而喻。本文将探讨数据采集的概念意义、方法工具、面临的挑战和应对策略以及注意事项。 一、数据采集的定义和重要性 &…

HTTP基础知识总结

目录 一、什么是HTTP? 二、与HTTP有关的协议 三、HTTP请求特征 四、HTTP组成格式 五、HTTP标头 1.通用标头 2.实体标头 3.请求标头 4.响应标头 六、HTTP状态码分类 我们在日常测试过程中,也可以通过浏览器F12简单定位是前端问题还是后端问题&a…

css学习之路:sass学习基础篇

SCSS 一、动态的样式语言 让CSS有变量的概念css有很多的缺点 语法不够强大,没有变量和合理的样式复用机制,导致难以维护,我们就可以使用动态样式语言,赋予CSS新的特性。常见的动态样式语言 scss/sass(scss兼容sass&am…

厚积薄发11年,鸿蒙究竟有多可怕

12月20日中国工程院等权威单位发布**《2023年全球十大工程成就》。本次发布的2023全球十大工程成就包括“鸿蒙操作系统”在内。入围的“全球十大工程成就”,主要指过去五年由世界各国工程科技工作者合作或单独完成且实践验证有效的,并且已经产生全球影响…

云尚办公项目学习

完整的笔记可以参考这个专栏,写的挺详细的:云尚办公课件笔记,come on boy form-create前端组件 formProps记录了表单有哪些表单项,分别是哪些类型(下拉,单选,输入框) formOptions记…

周鸿祎分享大模型十大趋势:2024将出现杀手级应用

1月5日,“2023年风马牛年终秀”上,三六零(601360.SH,下称“360”)集团创始人周鸿祎分享了对2024年大模型发展趋势的十大预测,呼吁企业树立AI信仰,All in AI。他认为,创新才能破局&am…

shell脚本实现九九乘法表

9*9乘法表 判断服务是否开启 1.查看80端口是否被监听 [rootlocalhost ~]# ss -an | grep 80 tcp LISTEN 0 128 *:80 *:* 2.查看80端口/httpd服务是否开启 [rootlocalhost ~]# n…