有時候在調用需要用非同步調用API介面。在python中有很多框架,比如 asyncio, Celery,Quart 等。這裡我選擇了 asyncio。Python 3.5以上版本內置了asyncio庫,可以用來編寫單線程的併發代碼。可以使用此庫與aiohttp結合來發送非同步HTTP請求。 Pytho ...
有時候在調用需要用非同步調用API介面。在python中有很多框架,比如 asyncio
, Celery
,Quart
等。這裡我選擇了 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)
本文來自博客園,作者:落魄統計佬,轉載請註明原文鏈接:https://www.cnblogs.com/tungsten106/p/async_request_filename_error.html