2017-02-15 9 views
1

Ich bin von requests Bibliothek von Python zu scrapy, und ich habe Probleme mit einer einfachen POST-Anfrage. Ich gründe Header und Nutzlast als solche:Scrapy POST-Anfrage funktioniert nicht - 400 Bad Request

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}} 

Und dann machen die Anfrage wie folgt aus:

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) 

Und das hält auf dem Geben Sie mir 400-Status. Wenn ich die Anfrage unter Verwendung der exakt gleichen Header und Payload mit der requests Bibliothek mache, gibt es mir 200 Status und gibt wie erwartet einen JSON zurück.

r = requests.post(url, headers=headers, data=json.dumps(payload), verify=False) 

Was mache ich falsch?

+2

Sie sollten wirklich nicht Ihre eigenen 'Content-Length' Header setzen. Die meisten Bibliotheken berechnen das für Sie. Wenn 'scrapy' es zweimal sendet, wird der Server * von der Spezifikation * aufgefordert, eine 400 zurückzugeben. –

+0

Das war es! Funktioniert jetzt wie ein Zauber. Vielen Dank! :) –

+0

@ sigmavirus24 diese Antwort ist großartig, bitte posten Sie es im Antwortbereich. –

Antwort

2

Einige dieser Header, die Sie in Ihrer Anfrage haben, sind für die Verwendung von allgemeinen HTTP-Bibliotheken nicht ratsam. Die meisten Bibliotheken werden diese selbst erzeugen:

  • Moderator
  • Content-Length

Insbesondere geben die HTTP RFCs sehr deutlich, dass jederzeit ein Content-Length Header mehr als einmal gesendet wird (die Scrapy sein könnte doing) dann muss die Antwort eine 400 sein. Anforderungen, wird wahrscheinlich nicht seine eigene Content-Length-Header und defers zu Ihrem.