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
    )

谢谢大家!