Асинхронный POST запрос не работает с более чем одним параметром headers

Есть два вида запроса:

Синхронный:

import requests


def TrackInfo(barcodes):
    url = "https://www.pochta.ru/tracking?p_p_id=trackingPortlet_WAR_portalportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=tracking.get-by-barcodes&p_p_cacheability=cacheLevelPage&p_p_col_id=column-1&p_p_col_count=2"

    headers={'Accept': '*/*', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': 'https://www.pochta.ru/tRACKING', 'Content-Type': 'application/x-www-form-urlencoded', 'Origin': 'https://www.pochta.ru', 'Content-Length': '23', 'DNT': '1', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'TE': 'Trailers', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36'}

    data = "barcodes={}".format(barcodes)


    resp = requests.post(url, headers=headers, data=data)
    #resp = aiohttp.post()

    print(resp.status_code)
    print(resp.text)

TrackInfo("14140266083447")

Асинхронный:

import asyncio, aiohttp


async def TrackInfo(barcodes):
    url = "https://www.pochta.ru/tracking?p_p_id=trackingPortlet_WAR_portalportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=tracking.get-by-barcodes&p_p_cacheability=cacheLevelPage&p_p_col_id=column-1&p_p_col_count=2"
    async with aiohttp.ClientSession() as session:
        
        headers={'Accept': '*/*', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': 'https://www.pochta.ru/tRACKING', 'Content-Type': 'application/x-www-form-urlencoded', 'Origin': 'https://www.pochta.ru', 'Content-Length': '23', 'DNT': '1', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'TE': 'Trailers', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36'}

        async with session.post(url, data=str(barcodes), headers=headers) as resp:
            #print(await resp.status)
            #print(await resp.text())
            print("Status:", resp.status)

            resp_text = await resp.text()
            print(resp_text)
            return resp_text

loop = asyncio.get_event_loop()
loop.run_until_complete(TrackInfo("14140266083447"))

Различие в том что синхронный запрос работает всегда, а асинхронный перестаёт работать когда добавляешь в headers более одного параметра. Асинхронный код начинает бесконечно ожидать...

Если кто-нибудь подскажет в чём проблема буду благодарен!


Ответы (1 шт):

Автор решения: Maxim Chyorny

Вы в заголовках передаете фейковую длину контента, попробуйте убрать её и у вас получится примерно такой код:

import asyncio, aiohttp


async def TrackInfo(barcodes):
    url = "https://www.pochta.ru/tracking?p_p_id=trackingPortlet_WAR_portalportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=tracking.get-by-barcodes&p_p_cacheability=cacheLevelPage&p_p_col_id=column-1&p_p_col_count=2"
    async with aiohttp.ClientSession() as session:
        
        headers={'Accept': '*/*', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': 'https://www.pochta.ru/tRACKING', 'Content-Type': 'application/x-www-form-urlencoded', 'Origin': 'https://www.pochta.ru', 'DNT': '1', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'TE': 'Trailers', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36'}

        async with session.post(url, data=str(barcodes), headers=headers) as resp:
            #print(await resp.status)
            #print(await resp.text())
            print("Status:", resp.status)

            resp_text = await resp.text()
            print(resp_text)
            return resp_text

asyncio.run(TrackInfo("14140266083447"))
``
→ Ссылка