前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >aiohttp 异步http请求-2.post 请求application/json和data

aiohttp 异步http请求-2.post 请求application/json和data

作者头像
上海-悠悠
发布2022-04-21 14:47:15
4.8K0
发布2022-04-21 14:47:15
举报

前言

aiohttp 发送post请求,body类型的常见的类型传参:

  • application/json
  • application/x-www-form-urlencode

application/json

POST 请求接口报文示例,Content-Type类型是application/json

代码语言:javascript
复制
POST /api/v1/login/ HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 42
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/1.0.3

{
    "password": "123456",
    "username": "test"
}

于是可以使用ClientSession.post()接受 json参数

代码语言:javascript
复制
import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession('http://127.0.0.1:8000') as session:
        body = {
                    "password": "123456",
                    "username": "test"
                }
        async with session.post('/api/v1/login', json=body) as resp:
            print(resp.url)
            print(await resp.text())

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行结果

代码语言:javascript
复制
http://127.0.0.1:8000/api/v1/login
{"code": 0, "msg": "login success!", "username": "test", "token": "ff7b608ed22407a4cd4d2f7beb1bfe9015574bdc"}

默认情况下,会话使用 python 的标准json模块进行序列化。但可以使用不同的 serializer. ClientSession接受json_serialize 参数:

代码语言:javascript
复制
import ujson

async with aiohttp.ClientSession(
        json_serialize=ujson.dumps) as session:
    await session.post(url, json={'test': 'object'})

笔记:ujson 比json快,但有些不兼容

JSON 响应内容

有一个内置的 JSON 解码器,以防您处理 JSON 数据:

代码语言:javascript
复制
        async with session.post('/api/v1/login', json=body) as resp:
            print(await resp.json())

如果json解码失败,会抛出异常ContentTypeError

代码语言:javascript
复制
    raise ContentTypeError(
aiohttp.client_exceptions.ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: text/html; charset=utf-8'

使用.json()解码器后,会将返回的内容解析成python里面的dict类型,方便取值

代码语言:javascript
复制
        async with session.post('/api/v1/login', json=body) as resp:
            res = await resp.json()
            token = res['token']
            print('token: ', token)

application/x-www-form-urlencode

POST 请求接口报文示例,Content-Type类型是application/x-www-form-urlencode

代码语言:javascript
复制
POST /api/v4/login HTTP/1.1
Content-Length: 29
Content-Type: application/x-www-form-urlencoded

username=test&password=123456

html上form表单数据的提交,只需传一个data参数即可

代码语言:javascript
复制
import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession('http://127.0.0.1:8000') as session:
        body = {
                    "password": "123456",
                    "username": "test"
                }
        async with session.post('/api/v4/login', data=body) as resp:
            print(await resp.json())


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行结果

代码语言:javascript
复制
{'code': 0, 'msg': 'login success!', 'username': 'test', 'token': '408434b72328ea6740f7f2c260a1c3f97be82fab'}

总结

如果要发送未进行表单编码的数据,可以通过传递 bytes 默认情况下内容类型设置为 ‘application/octet-stream’:

代码语言:javascript
复制
async with session.post(url, data=b'\x00Binary-data\x00') as resp:
    ...

如果要发送 JSON 数据:

代码语言:javascript
复制
async with session.post(url, json={'example': 'test'}) as resp:
    ...

要发送具有适当内容类型的文本,只需使用data参数

代码语言:javascript
复制
async with session.post(url, data='Тест') as resp:
    ...

2022年第 1 期《Python 测试平台开发》课程

2022年第 10 期《python接口web自动化+测试开发》课程,2月13号开学

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • application/json
  • JSON 响应内容
  • application/x-www-form-urlencode
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档