Während es Möglichkeiten gibt, Authentifizierung in urllib2 zu behandeln, wenn Sie Basic Authorization verwenden (was effektiv das Senden des Benutzernamens und des Passworts im Klartext bedeutet), können Sie alles, was Sie wollen, mit einem urllib2.Request und urllib2.urlopen tun:
import urllib2
def basic_authorization(user, password):
s = user + ":" + password
return "Basic " + s.encode("base64").rstrip()
req = urllib2.Request("http://localhost:8000/36576/speak.json",
headers = {
"Authorization": basic_authorization("7898678", "X"),
"Content-Type": "application/json",
# Einige zusätzliche Header zum Spaß
"Accept": "*/*", # curl macht das
"User-Agent": "my-python-app/1", # sonst wird "Python-urllib/..." verwendet
},
data = '{"message":{"body":"TEXT"}}')
f = urllib2.urlopen(req)
Ich habe dies mit netcat getestet, damit ich sehen konnte, dass die gesendeten Daten in beiden Fällen bis auf die Reihenfolge identisch waren. Hier wurde der erste mit curl und der zweite mit urllib2 gemacht
% nc -l 8000
POST /36576/speak.json HTTP/1.1
Authorization: Basic Nzg5ODY3ODpY
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: localhost:8000
Accept: */*
Content-Type: application/json
Content-Length: 27
{"message":{"body":"TEXT"}} ^C
% nc -l 8000
POST /36576/speak.json HTTP/1.1
Accept-Encoding: identity
Content-Length: 27
Connection: close
Accept: */*
User-Agent: my-python-app/1
Host: localhost:8000
Content-Type: application/json
Authorization: Nzg5ODY3ODpY
{"message":{"body":"TEXT"}}^C
(Dies wurde leicht angepasst aus der Ausgabe. Mein Testfall hat nicht denselben URL-Pfad verwendet, den Sie verwendet haben.)
Es ist nicht notwendig, das zugrunde liegende httplib zu verwenden, das Dinge, die urllib2 Ihnen bietet, wie z.B. Proxy-Unterstützung, nicht unterstützt. Andererseits finde ich urllib2 außerhalb dieser einfachen Art von Anfrage kompliziert und wenn Sie eine bessere Unterstützung dafür haben möchten, welche Header gesendet werden und in welcher Reihenfolge sie gesendet werden, dann nutzen Sie httplib.