POST 使用 aiohttp 请求 returns 对于稍大的文件无效的方法
POST request with aiohttp returns invalid method for slightly larger files
我尝试为我的一项服务实施 aiohttp 请求。我需要将带有 .pdf 文件的 POST 请求发送给另一个 API。此 API 接受 multipart/form-data 和 application/pdf。
以下代码适用于某些 .pdf:
async with aiohttp.ClientSession() as session:
async with session.post(URL, data={'file': open(file_to_store, 'rb').read()}) as aioresp:
asynresp = await aioresp.json()
但是对于稍微大一点的 .pdf,我从接收 API 和
中得到一个错误
WARNING: Invalid HTTP request received.
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 131, in data_received
self.parser.feed_data(data)
File "httptools/parser/parser.pyx", line 212, in httptools.parser.parser.HttpParser.feed_data
httptools.parser.errors.HttpParserInvalidMethodError: Invalid method encountered
我认为它与 aiohttp 尝试流式传输更大的文件有关,但我不知道如何以其他方式格式化请求?
因为我无法解决问题,所以我切换到 httpx,一切正常,我的问题在几分钟内就解决了。注意超时,您应该设置一个对您的要求有意义的值。我强烈推荐 httpx:https://www.python-httpx.org/
files = {'file': open(file_to_store, 'rb')}
async with httpx.AsyncClient() as client:
r = await client.post(URL, files=files, timeout=None)
我尝试为我的一项服务实施 aiohttp 请求。我需要将带有 .pdf 文件的 POST 请求发送给另一个 API。此 API 接受 multipart/form-data 和 application/pdf。 以下代码适用于某些 .pdf:
async with aiohttp.ClientSession() as session:
async with session.post(URL, data={'file': open(file_to_store, 'rb').read()}) as aioresp:
asynresp = await aioresp.json()
但是对于稍微大一点的 .pdf,我从接收 API 和
中得到一个错误WARNING: Invalid HTTP request received.
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 131, in data_received
self.parser.feed_data(data)
File "httptools/parser/parser.pyx", line 212, in httptools.parser.parser.HttpParser.feed_data
httptools.parser.errors.HttpParserInvalidMethodError: Invalid method encountered
我认为它与 aiohttp 尝试流式传输更大的文件有关,但我不知道如何以其他方式格式化请求?
因为我无法解决问题,所以我切换到 httpx,一切正常,我的问题在几分钟内就解决了。注意超时,您应该设置一个对您的要求有意义的值。我强烈推荐 httpx:https://www.python-httpx.org/
files = {'file': open(file_to_store, 'rb')}
async with httpx.AsyncClient() as client:
r = await client.post(URL, files=files, timeout=None)