Я перехожу из библиотеки requests
от python в scrapy
, и у меня возникают проблемы с простым запросом POST. Я устанавливаю заголовки и полезную нагрузку, например:Scrapy POST запрос не работает - 400 Неверный запрос
headers = {
'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, br',
'accept-language':'en_US',
'Connection':'keep-alive',
'Content-Length':'151',
'content-type':'application/json',
'Cookie':cookie,
'Host':host,
'Origin':origin,
'Referer':referer,
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'x-csrf-token':token
}
payload = {"targetLocation":{"latitude":lat,"longitude":lng}}
А затем сделать запрос, как это:
def start_requests(self):
u = self.url
yield scrapy.Request(u, method='POST',
callback=self.parse_httpbin,
errback=self.errback_httpbin,
body=json.dumps(self.payload),
headers=self.headers)
И продолжает давать мне 400 статус. Если я сделаю запрос, используя те же заголовки и полезную нагрузку в библиотеке requests
, он дает мне статус 200 и возвращает json, как и ожидалось.
r = requests.post(url, headers=headers, data=json.dumps(payload), verify=False)
Что я делаю неправильно?
Вы действительно не должны устанавливать свой собственный заголовок Content-Length. Большинство библиотек вычислит это для вас. если 'scrapy' отправляет его дважды, сервер * требуется * по спецификации, чтобы вернуть 400. –
Вот и все! Сейчас работает как шарм. Благодаря! :) –
@ sigmavirus24 этот ответ велик, пожалуйста, разместите его в области ответа. –