Senden eines HTTP-POST-Anforderung von Python (versuchen, zu konvertieren von PHP)
Ich versuche zu konvertieren, das code-snippet von PHP zu Python (Programmier-Neuling) und finde die Schwierigkeit dabei:
PHP, die ich versuche zu konvertieren ist wie folgt:
$fp = fsockopen($whmcsurl, 80, $errno, $errstr, 5);
if ($fp) {
$querystring = "";
foreach ($postfields AS $k=>$v) {
$querystring .= "$k=".urlencode($v)."&";
}
$header="POST ".$whmcsurl."modules/servers/licensing/verify.php HTTP/1.0\r\n";
$header.="Host: ".$whmcsurl."\r\n";
$header.="Content-type: application/x-www-form-urlencoded\r\n";
$header.="Content-length: ".@strlen($querystring)."\r\n";
$header.="Connection: close\r\n\r\n";
$header.=$querystring;
$data="";
@stream_set_timeout($fp, 20);
@fputs($fp, $header);
$status = @socket_get_status($fp);
while (!@feof($fp)&&$status) {
$data .= @fgets($fp, 1024);
$status = @socket_get_status($fp);
}
@fclose ($fp);
}
Entsprechenden Python-code, der ich geschrieben habe, ist wie folgt:
fp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
fp.connect(("my ip", 80))
if (fp):
querystring = ""
#print postfields
for key in postfields:
querystring = querystring+key+"="+urllib.quote(str(postfields[key]))+"&"
header = "POST "+whmcsurl+"modules/servers/licensing/verify.php HTTP/1.0\r\n"
header+="Content-type: application/x-www-form-urlencoded\r\n"
header+="Content-length: "+str(len(querystring))+"\r\n"
header+="Connection: close\r\n\r\n"
#header+=querystring
data=""
request = urllib2.Request(whmcsurl,querystring,header)
response = urllib2.urlopen(request)
data = response.read()
Hier bin ich konfrontiert mit der folgenden Fehlermeldung:
request = urllib2.Request(whmcsurl,querystring,header)
File "/usr/lib64/python2.6/urllib2.py", line 200, in __init__
for key, value in headers.items():
AttributeError: 'str' object has no attribute 'items'
Also ich vermute, dass Python erwartet ein Wörterbuch für den header. Aber die PHP sendet es als string.
Kann ich wissen, wie ich dieses Problem lösen?
Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie overcomplicating Dinge, von einiger Entfernung. Python kümmert sich um die meisten für Sie. Es gibt keine Notwendigkeit, einen socket zu öffnen sich selbst, noch brauchen Sie, um zu bauen-Header und dem HTTP-Eröffnung Linie.
Verwenden Sie die
das urllib
undurllib2
Module, um die Arbeit für Sie tun:urlopen()
nimmt einen zweiten parameter, der zu verschickenden Daten in einePOST
Anfrage; die Bibliothek kümmert sich um die Berechnung der Länge des Körpers, und setzt die entsprechenden Header. Die meisten von allen, unter der Haube, verwendet es eine andere Bibliothek,httplib
, kümmern sich um die socket-Verbindung und der Herstellung gültigen Header und HTTP-request-Zeile.Des POST-body ist codiert
urllib.urlencode()
, die kümmert sich auch um das richtige zitieren für Sie.Möglicherweise möchten Sie auch einen Blick in die externe
Anfragen
- Bibliothek, die bietet eine einfach zu verwendende API noch:params = urlencode(postfields)
urlopen()
. Denn Sie senden einen Körper (einen zweiten parameter) ein BEITRAG gesendet wird, und der content-type und content-length-Header gesetzt sind. Der Host-header ist immer gesetzt.dem Header sollte dann so Aussehen
POST ... HTTP/1.0
Zeile ist nicht Kopf-und muss nicht konstruiert werden, in jedem Fall, zum Beispiel.