2017-09-26 1 views
0

Ich versuche, eine Website in Python abzufragen. Ich muss eine POST-Methode verwenden (entsprechend dem, was in meinem Browser passiert, wenn ich es mit den Entwicklertools beobachte).POST-Methode in Python: errno 104

Wenn ich die Website mit cURL abfragen, es funktioniert gut:

curl -i --data "param1=var1&param2=var2" http://www.test.com 

ich diesen Header erhalten:

HTTP/1.1 200 OK 
Date: Tue, 26 Sep 2017 08:46:18 GMT 
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.26.1a mod_fastcgi/2.4.2 PHP/4.3.11 
Transfer-Encoding: chunked 
Content-Type: text/html 

Aber wenn ich es in Python zu tun 3, erhalte ich einen Fehler 104.

Hier ist, was ich bisher versucht habe. Zuerst mit urllib (inspiriert von this thread bekommen zu verwalten statt GET eine POST-Methode zu verwenden):

import re 
from urllib import request as ur 

# URL to handle request                      
url = "http://www.test.com" 
data = "param1=var1&param2=var2" 

# Build a request dictionary 
preq = [re.findall("[^=]+", i) for i in re.findall("[^\&]+", data)] 
dreq = {i[0]: i[1] if len(i) == 2 else "" for i in preq} 

# Initiate request & add method 
ureq = ur.Request(url)                      
ureq.get_method = lambda: "POST"                   
# Send request                        
req = ur.urlopen(ureq, data=str(dreq).encode())                

ich im Grunde mit requests das gleiche tat

import re 
import requests 

# URL to handle request                      
url = "http://www.test.com" 
data = "param1=var1&param2=var2" 

# Build a request dictionary 
preq = [re.findall("[^=]+", i) for i in re.findall("[^\&]+", data)] 
dreq = {i[0]: i[1] if len(i) == 2 else "" for i in preq} 

# Initiate request & add method 
req = requests.post(url, data=dreq)                

In beiden Fällen bekomme ich ein HTTP 104 Fehler:

ConnectionResetError: [Errno 104] Connection reset by peer 

das verstehe ich nicht, da die gleiche Anfrage mit curl arbeitet. Ich vermute, ich habe etwas mit Python-Anfrage missverstanden, aber bisher stecke ich fest. Jeder Hinweis würde geschätzt werden!

Antwort

0

Ich habe gerade herausgefunden, dass ich keine Daten im richtigen Format übergeben habe. Ich dachte, es müsste in einem dict gespeichert werden; das ist nicht der Fall und es ist daher viel einfacher, dass was ich vorher versucht habe.

Mit urllib:

req = ur.urlopen(ureq, data=str(data).encode()) 

Mit requests:

req = requests.post(url, data=data) 
Verwandte Themen