翼度科技»论坛 编程开发 python 查看内容

使用aiohttp异步调用API+request上传文件中文文档名乱码解决方案

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
有时候在调用需要用异步调用API接口。在python中有很多框架,比如 asyncio, Celery,Quart 等。这里我选择了 asyncio。Python 3.5以上版本内置了asyncio库,可以用来编写单线程的并发代码。可以使用此库与aiohttp结合来发送异步HTTP请求。
Python调用案例

GET
  1. import asyncio
  2. import aiohttp
  3. async def fetch(session, url):
  4.     async with session.get(url) as response:
  5.         return await response.text()
  6. async def main():
  7.     # 指定要请求的URL
  8.     url = "http://example.com"
  9.    
  10.     # 创建一个异步的HTTP会话
  11.     async with aiohttp.ClientSession() as session:
  12.         html = await fetch(session, url)  # 发送请求并获取响应
  13.         print(html)  # 打印响应内容
  14. # 运行异步主函数
  15. asyncio.run(main())
复制代码
POST

参数为JSON
  1. import asyncio
  2. import aiohttp
  3. async def fetch(session, url, data):
  4.     # 使用session.post发送POST请求,data是POST请求的数据
  5.     async with session.post(url, data=data) as response:
  6.         return await response.text()  # 返回响应的文本内容
  7. async def main():
  8.     url = "http://example.com"  # 指定URL
  9.     data = {'key': 'value'}  # 准备发送的数据
  10.     async with aiohttp.ClientSession() as session:
  11.         html = await fetch(session, url, data)  # 发送POST请求并获取响应
  12.         print(html)  # 打印响应内容
  13. # 运行异步主函数
  14. asyncio.run(main())
复制代码
需要同时上传文件和JSON参数
  1. import asyncio
  2. import aiohttp
  3. from aiohttp import FormData
  4. async def fetch(session, url, data):
  5.     async with session.post(url, data=data) as response:
  6.         return await response.text()
  7. async def main():
  8.     url = "http://example.com/upload"  # 模拟的文件上传URL
  9.     # 准备文件字典
  10.     files = {
  11.         'file1': open('example1.txt', 'rb'),
  12.         'file2': open('example2.txt', 'rb')
  13.     }
  14.     # 准备普通表单数据
  15.     form_data = {
  16.         'username': 'user1',
  17.         'password': 'pass123'
  18.     }
  19.     data = FormData()
  20.     # 添加普通表单数据
  21.     for key, value in form_data.items():
  22.         data.add_field(key, value)
  23.    
  24.     # 添加文件
  25.     for file_name, file_obj in files.items():
  26.         data.add_field(file_name,
  27.                        file_obj,
  28.                        filename=file_name,
  29.                        content_type='text/plain'        # 这里可以不填或者根据自己上传的文件格式修改
  30.                       )
  31.     async with aiohttp.ClientSession() as session:
  32.         html = await fetch(session, url, data)  # 发送文件和其他数据
  33.         print(html)
  34.     # 确保所有文件在发送后都已关闭
  35.     for file in files.values():
  36.         file.close()
  37. # 运行异步主函数
  38. asyncio.run(main())
复制代码
中文文档名报错

在上传文档路径名文件路径包含了中文字符时,使用aiohttp传递参数会将文件名变成乱码,这通常是因为路径中的非ASCII字符被编码成了URL编码或者类似的格式。
在request端无法进行修改,我们可以在被调用的api中需要用到filename处增加这一行来进行更改:
  1. from urllib.parse import unquote
  2. file.filename = unquote(file.filename)
复制代码
来源:https://www.cnblogs.com/tungsten106/p/async_request_filename_error.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具