Асинхронный 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"))
``