Хобрук: Ваш путь к мастерству в программировании

Python запрашивает POST, отсутствует Content-Length для определенного URL-адреса

Я пытаюсь выполнить базовый запрос POST с помощью модуля Requests, но Content-Length всегда отсутствует, поэтому сервер игнорирует полезную нагрузку. Моя полезная нагрузка - это dict, но запросы не могут рассчитать Content-Length.

Вот мой код:

form = {
'InternalApplicationSource' : 'signedinhome.recommendedjobs',
'__RequestVerificationToken' : str(rvt),
'Candidate.CVName' : 'CV.docx',
'JobTitle' : str(jtl),
'AppSource.AppSourceId' : '',
'AppSource.MatchCount' : '',
'IsExternalApplication' : 'False',
'Candidate.CoverLetterPreference' : 'None',
'Candidate.IsExternalApplication' : 'False',
'JobId' : str(jid),
'Source' : 'signedinhome.recommendedjobs',
'UserHasRegisteredThroughJob' : 'False'
}


post_headers = {
'Host': 'www.reed.co.uk',
'Origin' : 'https://www.reed.co.uk',
'User-Agent': browser,
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.7,jv;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'DNT': '1',
'Connection': 'keep-alive',
'TE': 'Trailers'
}

post_headers.update({'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Referer' : joburl , 'X-Requested-With': 'XMLHttpRequest', 'Content-Length':str(len(form))})
postres = session.post('https://www.reed.co.uk/api/application/apply',headers=post_headers,data=form)

И это заголовки, которые фактически отправлены (получены из postres.request.headers)

User-Agent : Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept-Encoding : gzip, deflate, br
Accept : */*
Connection : keep-alive
Host : www.reed.co.uk
Origin : https://www.reed.co.uk
Accept-Language : en-US,en;q=0.7,jv;q=0.3
DNT : 1
TE : Trailers
Referer : https://www.reed.co.uk/jobs/
X-Requested-With : XMLHttpRequest

Я пробовал как установить Content-Length (как указано выше), так и просто оставить Requests для его вычисления, но этого никогда не происходит, он всегда отсутствует в отправляемых заголовках.

Я заметил, что он также пропускает заголовок Content-Type — означает ли это, что это проблема с кодировкой?

Кто-нибудь знает, как это исправить?

изменить: я также заметил, что это происходит только с этим конкретным URL-адресом, любой другой URL-адрес, похоже, в порядке (длина и тип содержимого в порядке). Я могу только предположить, что это проблема с модулем запросов, поскольку это касается отправляемых данных. Может быть, модуль запросов сначала проверяет URL-адрес и как-то по-разному действует для разных URL-адресов?


  • Попробуйте добавить заголовок типа «Content-Type»: «application/x-www-form-urlencoded; charset=UTF-8' - не уверен, но вам также может понадобиться явно кодировать и декодировать URL в двоичный код. 02.06.2020
  • Но обратите внимание, что вы должны удалить заголовок длины содержимого, и запросы должны добавлять его. 02.06.2020
  • Вы пытались отслеживать, что отправляет ваш код? Может быть какая-то другая причина - вы сделали GET в сеансе перед выполнением POST, чтобы загрузить, например. печенье? Попробуйте сравнить то, что отправляет ваш код, с тем, что отправляет браузер, делая то же самое. 02.06.2020
  • Я только что заметил, что это происходит только с этим конкретным URL-адресом, с любым другим URL-адресом все в порядке (длина и тип содержимого в порядке). Я могу только предположить, что это проблема с модулем запросов, поскольку это касается отправляемых данных. Знаете ли вы, проверяет ли модуль запросов сначала URL-адрес и как-то по-разному действует для разных URL-адресов? 14.06.2020
  • Похоже, проблема не в запросах. Но вы можете попробовать задать вопросы по запросам github. 14.06.2020
  • Я бы проверил, что на самом деле отправлено по сети, используя, например, Telerik Fiddler или mitm. 14.06.2020
  • Спасибо за помощь! Оказывается, мой запрос перенаправлялся, поэтому то, что я печатал на экране, было только последним запросом... когда я использовал allow_redirects=False, я, наконец, смог увидеть, что на самом деле были и тип контента, и длина контента, все хорошо. 16.06.2020

Ответы:


1

Оказывается, мой запрос перенаправлялся, поэтому то, что я печатал на экране, было только последним запросом... когда я использовал allow_redirects=False, я наконец смог увидеть свой исходный запрос POST. И я мог видеть, что на самом деле были и Content-Type, и Content-Length, все правильно!

16.06.2020
Новые материалы

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..