Python 使用 async、await、aiohttp 未收到响应
Python no response received using async, await, aiohttp
我正在编写一个代理来篡改 SOAP 请求并使用 aiohttp 网络应用程序将其发送到目的地,并使用 aiohttp 进行异步 POST。
我的请求方法定义如下:
async def proxy(request):
headers = dict(request.headers)
headers.pop('access-token')
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
result = await session.post(
ACTION,
data=await request.content.read(),
headers=request.headers
)
retorno = await result.read()
return web.Response(
body=retorno,
status=result.status
)
这很好用; async read
来自源,async await
来自目的地。
但我需要对消息进行一些篡改,如下所示:
async def proxy(request):
headers = dict(request.headers)
headers.pop('access-token')
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
data = await request.content.read()
data = data.replace(b'###USER###', AUTH_USER)
data = data.replace(b'###PASSWORD###', AUTH_PASSWORD)
result = await session.post(
ACTION,
data=data,
headers=request.headers
)
retorno = await result.read()
return web.Response(
body=retorno,
status=result.status
)
这只是在 result = await session.post
方法中停止并永远等待。没有收到回复。
有什么想法吗?
哦,天哪,这既蹩脚又可耻,但由于测试不当,我对我的问题的最初回答是错误的。
解决方案比我想象的要简单和晦涩得多。
因为我替换了所有的 header(尽量不让请求缓和太多),所以我也替换了 Content-Length header。
这导致服务器一直等待 for-ever 直到消息结束。
在调整邮件之前,只使用了 headers.pop('Content-Length')
并发送了来自发件人的所有 header。
它就像一个魅力。
--------原(错误)答案--------
刚刚弄明白了。
针对 SoapUI 模拟服务进行测试后,检查请求是否正确。
远程 API 是用我未知的技术实现的,但是,我不能只在数据字段中推送一个字节数组,即使 aiohttp.streams.StreamReader 返回它也是如此。
刚刚将其解码为 utf8,一切正常!
async def proxy(request):
headers = dict(request.headers)
headers.pop('access-token')
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
data = await request.content.read()
data = data.replace(b'###USER###', USER)
data = data.replace(b'###PASSWORD###', PASSWORD)
result = await session.post(
ACTION,
data=data.decode('utf8'),
headers=request.headers
)
retorno = await result.read()
return web.Response(
body=retorno,
status=result.status
)
谢谢大家!
我正在编写一个代理来篡改 SOAP 请求并使用 aiohttp 网络应用程序将其发送到目的地,并使用 aiohttp 进行异步 POST。
我的请求方法定义如下:
async def proxy(request):
headers = dict(request.headers)
headers.pop('access-token')
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
result = await session.post(
ACTION,
data=await request.content.read(),
headers=request.headers
)
retorno = await result.read()
return web.Response(
body=retorno,
status=result.status
)
这很好用; async read
来自源,async await
来自目的地。
但我需要对消息进行一些篡改,如下所示:
async def proxy(request):
headers = dict(request.headers)
headers.pop('access-token')
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
data = await request.content.read()
data = data.replace(b'###USER###', AUTH_USER)
data = data.replace(b'###PASSWORD###', AUTH_PASSWORD)
result = await session.post(
ACTION,
data=data,
headers=request.headers
)
retorno = await result.read()
return web.Response(
body=retorno,
status=result.status
)
这只是在 result = await session.post
方法中停止并永远等待。没有收到回复。
有什么想法吗?
哦,天哪,这既蹩脚又可耻,但由于测试不当,我对我的问题的最初回答是错误的。
解决方案比我想象的要简单和晦涩得多。
因为我替换了所有的 header(尽量不让请求缓和太多),所以我也替换了 Content-Length header。 这导致服务器一直等待 for-ever 直到消息结束。
在调整邮件之前,只使用了 headers.pop('Content-Length')
并发送了来自发件人的所有 header。
它就像一个魅力。
--------原(错误)答案--------
刚刚弄明白了。
针对 SoapUI 模拟服务进行测试后,检查请求是否正确。
远程 API 是用我未知的技术实现的,但是,我不能只在数据字段中推送一个字节数组,即使 aiohttp.streams.StreamReader 返回它也是如此。
刚刚将其解码为 utf8,一切正常!
async def proxy(request):
headers = dict(request.headers)
headers.pop('access-token')
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
data = await request.content.read()
data = data.replace(b'###USER###', USER)
data = data.replace(b'###PASSWORD###', PASSWORD)
result = await session.post(
ACTION,
data=data.decode('utf8'),
headers=request.headers
)
retorno = await result.read()
return web.Response(
body=retorno,
status=result.status
)
谢谢大家!