各位大佬,我今天用 requests 模块调接口正常,用 aiohttp 模块调接口出问题,排查发现是 aiohttp 发送请求时的 urlencode 和 requests 的不一样,具体如下,请问下大佬们,这个要如何处理呢?
url = "http://api.baidu.com/test-files/testFiles/1234/%E9%97%AE%E9%A2%98%E5%8D%95%E6%97%B6%E6%95%88-%E8%B7%9F%E8%BF%9B_2020-04-02%2000%3A00%3A00_2020-04-08%2000%3A00%3A00_5675.xlsx.zip"
def delete_url1(url):
r = requests.delete(url)
print(f"requests 模块请求地址为:{r.url}")
delete_url1(url)
print()
async def delete_url2(url):
async with aiohttp.ClientSession() as session:
async with session.delete(url) as resp:
print(f"aiohttp 模块请求地址为:{resp.url}")
asyncio.run(delete_url2(url))
执行结果: requests 模块请求地址为: http://api.baidu.com/test-files/testFiles/1234/%E9%97%AE%E9%A2%98%E5%8D%95%E6%97%B6%E6%95%88-%E8%B7%9F%E8%BF%9B_2020-04-02%2000%3A00%3A00_2020-04-08%2000%3A00%3A00_5675.xlsx.zip
1
ohayoo OP |
2
AilF 2023-09-06 19:21:01 +08:00 1
用 yarl URL session.delete(URL(url, encoded=True)) 包一下就能拿到和 requests 一致的 url 了
|
3
inkmulberry 2023-09-06 19:29:40 +08:00
菜鸟理解:看样子是一个是冒号进行编码了一个是没有编码,直接把冒号用%3A 替换了
|
5
ochatokori 2023-09-06 20:13:06 +08:00 via Android 1
在 js 中,这是 encodeURI 和 encodeURIComponent 的区别,一个是会转义 uri 的保留字,一个不会,:就是 uri 保留字
|
6
ohayoo OP @ochatokori #5 涨知识了,多谢
|