首页 > 其他分享 >使用aiohttp异步调用API+request上传文件中文文档名乱码解决方案

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

时间:2023-12-27 18:36:07浏览次数:39  
标签:aiohttp url request 乱码 session file async data

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

Python调用案例

GET

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    # 指定要请求的URL
    url = "http://example.com"
    
    # 创建一个异步的HTTP会话
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url)  # 发送请求并获取响应
        print(html)  # 打印响应内容

# 运行异步主函数
asyncio.run(main())

POST

参数为JSON

import asyncio
import aiohttp

async def fetch(session, url, data):
    # 使用session.post发送POST请求,data是POST请求的数据
    async with session.post(url, data=data) as response:
        return await response.text()  # 返回响应的文本内容

async def main():
    url = "http://example.com"  # 指定URL
    data = {'key': 'value'}  # 准备发送的数据

    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url, data)  # 发送POST请求并获取响应
        print(html)  # 打印响应内容

# 运行异步主函数
asyncio.run(main())

需要同时上传文件和JSON参数

import asyncio
import aiohttp
from aiohttp import FormData

async def fetch(session, url, data):
    async with session.post(url, data=data) as response:
        return await response.text()

async def main():
    url = "http://example.com/upload"  # 模拟的文件上传URL

    # 准备文件字典
    files = {
        'file1': open('example1.txt', 'rb'),
        'file2': open('example2.txt', 'rb')
    }

    # 准备普通表单数据
    form_data = {
        'username': 'user1',
        'password': 'pass123'
    }

    data = FormData()
    # 添加普通表单数据
    for key, value in form_data.items():
        data.add_field(key, value)
    
    # 添加文件
    for file_name, file_obj in files.items():
        data.add_field(file_name,
                       file_obj,
                       filename=file_name,
                       content_type='text/plain'	# 这里可以不填或者根据自己上传的文件格式修改
                      )

    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url, data)  # 发送文件和其他数据
        print(html)

    # 确保所有文件在发送后都已关闭
    for file in files.values():
        file.close()

# 运行异步主函数
asyncio.run(main())

中文文档名报错

在上传文档路径名文件路径包含了中文字符时,使用aiohttp传递参数会将文件名变成乱码,这通常是因为路径中的非ASCII字符被编码成了URL编码或者类似的格式。

在request端无法进行修改,我们可以在被调用的api中需要用到filename处增加这一行来进行更改:

from urllib.parse import unquote

file.filename = unquote(file.filename)

标签:aiohttp,url,request,乱码,session,file,async,data
From: https://www.cnblogs.com/tungsten106/p/async_request_filename_error.html

相关文章

  • [Nginx] API请求体过大时,报:Nginx 413 Request Entity Too Large [转载]
    1问题描述此问题(通过方法1)已解决,但整体的解决思路,参考自网友,故著名为【转载】文章昨晚压测时,通过API请求10000个设备的若干信号(5个)状态时,Postman返回Nginx的如下错误API整个请求有1.37MB413RequestEntityTooLarge2问题分析通过字面意思,即可知悉:nginx的cl......
  • Spring Boot学习随笔- RestFul API(@RestController、@RequestBody、@PathVariable),使用
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第十六章、RestFulAPI什么是RESTREST全称是ResourceRepresentationalStateTransfer,中文意思是表述性状态转移,它首次出现在2000年RoyFielding的博士论文中,RoyFielding是HTTP规范的主要编写者之一。他在论文中表......
  • SSM 框架中 Form表单提交 通过request.getParameter("属性名") 获取的结果为null
    今日换机器引入项目源码之后,项目中表单提交到后台,获取不到参数值前台代码大致如下<formaction="/login"method="post"name="loginForm"id="loginForm"><divstyle="width:382px;height:376px;padding:27px0px;margin:0px84px......
  • git 提交后中文字符会乱码
    转载自:https://blog.csdn.net/yilongchuan/article/details/92833077最近发生那了一件怪事,当然菜鸡经常碰见怪事本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitlab上发现.properties的所有中文字符都变成了\xxxx的ascii的编码。 然......
  • 这个标题乱码不能显示怎么解决呀?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个matplotlib可视化的问题,一起来看看吧。问题描述:大佬们请问下这个标题乱码不能显示怎么解决呀?ai让我直接加,encoding='utf-8' 但是这个报错AttributeError:Text.set()gotanunexpectedkey......
  • 依赖注入容器 perRequest(Transient)和Singleton区别
    在CM框架中,"perRequest"和"Singleton"都是生命周期配置选项,用于指示对象的创建和共享方式。它们之间的区别在于对象实例的生命周期和共享方式。对于"perRequest"(有时被称为"Transient"):对象的实例在每个请求处理期间只创建一次,并在同一个请求内共享。每个请求都有自己的对象实例,不......
  • cmd 中文乱码 VS Studio utf-8 中文乱码
      2、永久修改win键+R,输入regedit,确定。打开注册表编辑器按顺序找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\CommandProcessor。点击右键-新建,选择“字符串值”。命名为“autorun”,点击右击修改,数值数据填写“chcp65001”,确定。这时候打开cmd命令窗口就会看到,和之......
  • Jenkins项目控制台输出结果乱码
    解决方法:1、设置全局配置,添加键和值键:LANG值:zh.CH.UTF-82、修改jenkins.xml文档(在Jenkins的安装目录下)搜索定位到<arguments>-Xrs-Xmx256m这一行,添加-Dfile.encoding=utf-83、重启Jenkins,使配置生效4、查看Jenkins配置,file.encoding为utf-8,配置生效5、重新尝试执行......
  • 通过tidevice 启动wda 提示: request error: ('Connection aborted.', MuxReplyError(
    当我在使用tidevice启动wda来做iOS自动化测试的时候一直会报错:requesterror:('Connectionaborted.',MuxReplyError(<UsbmuxReplyCode.ConnectionRefused:3>))我在网上也一直翻翻翻寻找答案,每一次眼看着就快解决了可到最后仍是出现这串错误❌,经过几番波折我能试的办法都试了......
  • efak启动中文乱码
    1.情景展示如上图所示,在windows下,当我们启动EFAK_HOME/bin/ke.bat后,最终运行的tomcat,输出的中文全部是乱码。如何解决?2.具体分析我们现在既然已经知道了efak最终运行的是tomcat服务器,那我们就可以:按照处理tomcat日志乱码的方式来解决。3.解决方案来到EFAK_HOME/kms/conf......