异步http接口调用库:httpx

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

总结:

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

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

异步http接口调用库:httpx,技术分享,httpx

 

文档获取方式:

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

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

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取文章来源地址https://www.toymoban.com/news/detail-791589.html

到了这里,关于异步http接口调用库:httpx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • QNetworkAccessManager实现可手动中断和超时机制的异步Http网络接口

    Qt中的网络访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置。因此实现Http请求必然需要使用QNetworkAccessManager 来开发。 需要注意的是:QNetworkAccessManager 是基于 QObject 的,所以只能在它所属的线程中使用。 1.超时机制:利用QTimer定时,在

    2024年03月19日
    浏览(45)
  • 【并发编程】线程池多线程异步去分页调用其他服务接口获取海量数据

    前段时间在做一个数据同步工具,其中一个服务的任务是调用A服务的接口,将数据库中指定数据请求过来,交给kafka去判断哪些数据是需要新增,哪些数据是需要修改的。 刚开始的设计思路是,,我创建多个服务同时去请求A服务的接口,每个服务都请求到全量数据,由于这些

    2024年02月13日
    浏览(38)
  • 探索高效的HTTP异步接口测试方法:从轮询等待到自动化方案

    本文将深入探讨HTTP异步接口测试的多个方面,包括轮询等待、性能测试以及自动化方案。通过详细的解释和实际案例,帮助您了解如何有效地测试异步接口,确保系统的稳定性和性能。   在现代软件开发中,HTTP异步接口扮演着至关重要的角色,它们允许应用程序在进行任务

    2024年02月11日
    浏览(34)
  • HTTP接口调用和RESTful调用的区别

    概述 HTTP接口调用是一种基于HTTP协议的远程调用方式,可以通过URL进行调用,适用于不同编程语言之间的调用。而RESTful调用是一种基于REST架构风格的远程调用方式,是HTTP接口调用的一种特殊实现,只是HTTP接口调用不一定要遵循RESTful的设计原则。 区别 URL表达形式不同: ○

    2024年02月09日
    浏览(52)
  • Java调用HTTP接口

    说明 Java调用HTTP接口可以使用Java的HttpURLConnection或HttpClient等工具 HttpURLConnection HttpClient

    2024年02月08日
    浏览(38)
  • python调用http接口

    在Python中,你可以使用内置的 urllib 库来调用HTTP接口。下面是一个简单的示例,展示如何使用 urllib.request 模块来发送GET请求: 在这个示例中,我们首先定义了要请求的URL。然后,我们使用 urlopen() 函数发送GET请求,并将响应对象存储在变量 response 中。最后,我们使用 read()

    2024年01月25日
    浏览(38)
  • 使用Java调用http接口

    使用Java调用HTTP接口的步骤如下: 创建一个URL对象,指定HTTP接口的地址。 打开URL连接,获取URLConnection对象。 设置URLConnection对象的请求方式、超时时间等参数。 发送请求,并获取服务器返回的响应结果。 处理响应结果,可以将响应结果转换成字符串或其他格式。 下面是一

    2024年02月15日
    浏览(43)
  • ABAP:调用HTTP接口详解

    DATA:pv_http_client TYPE REF TO if_http_client, pv_url TYPE string. 1.可以通过URL连接或者IP:端口连接,根据实际情况而定, 建议使用URL,省去地址服务器域名转换 \\\"URL接连 CALL METHOD cl_http_client=create_by_url EXPORTING url = pv_url IMPORTING client = pv_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2

    2023年04月12日
    浏览(44)
  • jmeter篇之http接口调用

    使用Jmeter实现简单的接口调用 安装 Jmeter已安装并配置完成,安装方法及配置请参考: https://blog.csdn.net/lw1558533893/article/details/123649439安装及配置 使用 1、找打安装目录下的bin文件夹(apache-jmeter-5.1bin),我的是在E盘,如下图所示: 2、在 bin文件夹中找到对应的jmeter.bat文件,

    2024年02月05日
    浏览(52)
  • http接口调用成功却返回404

    记录调用http接口成功却返回404的问题 问题表现如下: 1、前端调用http接口,接口返回404 2、通过debug确认,接口调用是成功的 3、接口会返回JSON数据 使用案例来表现该问题 1、后端接口代码 2、前端调用返回的码为: 404 ,但实际上调用是正常的,这里就不截图了   原因:后

    2024年02月10日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包