1

我正在调用以下JSON-EndPoint以检索reference_number.

对 3 个请求使用正常for循环,我已经能够为每个请求接收一个新令牌,如下所示:

import httpx


for _ in range(3):
    r = httpx.get(
        'https://zenpay.zenithpayments.com.au/CyberSource/getsignedobject?programId=2&siteId=2')
    print(r.json()['signedObject']['reference_number'])

输出:

P2S2M1R20210307004644
P2S2M1R20210307004645
P2S2M1R20210307004646

现在,我正在尝试发送一个async请求,其中每个请求都使用它自己的会话,但对于同时发送的所有请求,我一直获得相同的值。

import trio
import httpx


async def main():

    async with trio.open_nursery() as nurse:

        async def call():
            async with httpx.AsyncClient(timeout=None) as client:
                r = await client.get('https://zenpay.zenithpayments.com.au/CyberSource/getsignedobject?programId=2&siteId=2')
                print(r.json()['signedObject']['reference_number'])

        for _ in range(3):
            nurse.start_soon(call)


if __name__ == "__main__":
    trio.run(main)

输出:

P2S2M1R20210307004912
P2S2M1R20210307004912
P2S2M1R20210307004912

注意:我知道每个请求的值都会增加 1,但我不能使用这个解决方案,因为这个值需要由 生成,BackEnd API以便稍后使用它进行身份验证。

另一方面,我认为它与根据源 IP 地址进行控制无关,因为API一旦您单独点击,就已经生成了令牌。

我可以在请求之间设置一个时间延迟,但这会减慢我的整个操作。

我已经验证每个客户端都代表它自己的,这意味着每个请求的底层套接字标识符都不同。

print(client, r.json()['signedObject']['reference_number'])

输出:

<httpx.AsyncClient object at 0x000001EF7815BF40> P2S2M1R20210307005512
<httpx.AsyncClient object at 0x000001EF78185250> P2S2M1R20210307005512
<httpx.AsyncClient object at 0x000001EF7817C670> P2S2M1R20210307005512

这里有线索吗?因为我什至试图玩,HTTP Transport但我不知道该怎么做!

4

0 回答 0