aiohttp是基于asyncio和Python的异步HTTP客户端以及服务器,在这里主要介绍aiohttp在客户端应用请求中的案例应用和案例实战。在使用前需要安装该第三方的库,安装的命令为:
pip3 install aiohttp
安装成功后可以直接使用。在Python的异步编程模式中,特别是想使用,最好保持Python版本是在Python3.5以上的版本,这是因为asyncio是在Python3.4的版本中开始引入。
我们使用aiohttp发送一个简单的网络请求,如请求http://httpbin.org/get,获取到它的响应数据,那么首先需要定义协程函数,在函数中,在函数名前加关键字async,这样的函数我们称为协程函数。先来看一个案例,源码如下:
#!/usr/bin/env python
#!coding:utf-8
import asyncio
import aiohttp
async def getPage():
async with aiohttp.ClientSession() as session:
async with session.get(url='http://httpbin.org/get') as r:
print(r.status)
print(await r.text())
if __name__ == '__main__':
loop=asyncio.get_event_loop()
loop.run_until_complete(getPage())
代码
loop=asyncio.get_event_loop()
loop.run_until_complete(getPage())
是创建事件循环,然后把任务添加到事件循环中进行执行,当然在异步中,与同步到区别是同步只能是等待一个任务执行结束后,再执行另外一个任务,而在异步到,遇到IO的堵塞立刻就会切换到其他的任务。相对而言,在微服务架构中它的通信模式也是基于同步通信和异步通信,而同步通信最大的缺陷是可能导致任务堵塞,如请求前面的任务请求超时,导致后面的任务会堵塞中,而异步的通信会立刻MQ来进行管理,客户端以及服务端也不会知道对方的存在,客户端和服务端只需要关注自己的MQ消息即可。这方面的知识体系在《Python接口自动化测试实战》课程体系里面有讲到,这里不再详细的扩散。刚才说到事件循环,那么也就意味着如果有批量的任务,那么批量的任务可以放到事件循环中然后进行执行,见如下案例源码:
#!/usr/bin/env python
#!coding:utf-8
import asyncio
import aiohttp
import time
async def get_httpbin():
async with aiohttp.ClientSession() as session:
async with session.get(url='http://httpbin.org/get') as r:
print(r.status)
print(await r.text())
async def get_taobao():
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl_context=False)) as session:
async with session.get(url='https://www.taobao.com/') as r:
print(r.status)
if __name__ == '__main__':
task_list=[
get_httpbin(),
get_taobao()
]
asyncio.run(asyncio.wait(task_list))
下面演示aiohttp在post请求的应用,其实aiohttp发送post请求和requests发送post请求在参数上都是一样的,唯一的区别就是aiohttp是基于异步的,还是以一个登录的案例作为案例来演示aiohttp在发送post请求中的应用,源码如下:
#!/usr/bin/env python
#!coding:utf-8
import asyncio
import aiohttp
async def login():
'''发送post的请求方法'''
async with aiohttp.ClientSession() as session:
async with session.post(
url='http://127.0.0.1:8000/auth/login',
json={"username":"134*****195","password":"asd888"},
headers={'Content-Type':'application/json;charset=UTF-8'}) as r:
print(r.status)
print(await r.json())
if __name__ == '__main__':
asyncio.run(login())
执行代码成功后就会显示登录成功后的响应结果信息。
后续会持续介绍AIOHTTP的案例实战应用和服务端稳定性测试的知识体系。
本文分享自微信公众号 - 测试技术圈(SoftwareTesters)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/leichen/blog/4459360