Posting raw-Daten mit Python

Ich bin Herumspielen mit der Google Checkout API und ich möchten, ziehen Sie es in einer Django-app. Ich brauche, um post-Daten zu Google mit basic-http-Authentifizierung. Ich habe die Prüfung dieses mit curl wie diese:

curl -d "$(cat mytest.xml)" -u username:password https://url

Und, dass die stellen der Inhalt meiner test-XML-Datei an Google. Und es funktioniert!

Aber ich habe Probleme bei der Portierung, die einfache Linie zu Python. Ich habe es geschafft verschiedene Möglichkeiten (httplib2, urllib2, pycurl) für die Verbindung mit einem Passwort und Entsendung etwas, aber der respose ist immer 400 BAD REQUEST.

Gibt es eine python-äquivalent für die Buchung von Textblock zu einem HTTP-Basic-auth-server? Mir rennt die Wände zu schlagen, meinen Kopf gegen.


Entschuldigungen für das nicht hinzufügen von code. Hier sind einige meiner größten hits. In jedem DATA ist eine XML-Zeichenfolge. URL, USERNAME und PASSWORD konstant sind.

req = urllib2.Request(URL)
req.add_header("Authorization", "Basic %s" % base64.encodestring('%s:%s'%(USERNAME, PASSWORD)))
u = urllib2.urlopen(req, DATA)

Gibt mir ein schönes HTTP Error 400: Bad Request


passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, URL, USERNAME, PASSWORD)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
pagehandle = urllib2.urlopen(URL, DATA)

Gibt HTTP Error 401: Unauthorized


pycurl.global_init(pycurl.GLOBAL_DEFAULT)
c = pycurl.Curl()
c.setopt(pycurl.URL, URL)
c.setopt(pycurl.USERPWD, "%s:%s" % (USERNAME,PASSWORD))
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPHEADER, ["Content-type: text/xml"])
c.setopt(pycurl.POSTFIELDS, DATA)
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.perform()

Scheint zu kämpfen, wobei die DATA string als POSTFIELD. Ich habe versucht urllib.urlencode()ing DATEN in mehrere verschiedene Möglichkeiten, aber


h = httplib2.Http()
h.add_credentials(USERNAME, PASSWORD)
print = h.request(URL, "POST", body=base64.encodestring(DATA))

Die Anmeldeinformationen nicht scheinen, etwas zu tun - ich erhalte eine nicht autorisierte Nachricht von Google.

Es gibt mehr, aber Sie sind alle auf dieser Grundlage.

InformationsquelleAutor Oli | 2011-12-15
Schreibe einen Kommentar