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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich mit ähnlichen Verwicklungen mit der stdlib Pakete, bis somoneone wies auf die genial Anfragen unterstützt grundlegende Http-Authentifizierung und anderen Authentifizierung bedeutet, gerade out-of-the-box! Und es hat eine schöne und einfache API-es tut weh!
Es unterstützt eine Vielzahl von anderen notwendigen Funktionen (e.g HTTPS -, Digest-Authentifizierung, etc) Bitte überprüfen Sie es heraus, wenn u müssen...
Während der Bearbeitung meiner post um einige Quelle, ich dachte, ich hätte noch ein Riss an
httplib2
(vor allem, weil es vergleichsweise klein und hübsch im Vergleich zu den anderen) und festgestellt, dass es ein klaffenden Fehler, dass seineadd_credentials(..)
Methode nicht wirklich etwas tun. Sie können umgehen dies durch die Angabe der header (so wie ich miturllib2
) wie folgt:Funktioniert.
Voidspace hat ein ausgezeichneter Artikel auf die Verwendung der basic-auth mit urllib2. Ich habe kopiert den entsprechenden code-snippet unten, geändert, POST.
Ohne zu sehen, Ihr code ist es schwer zu sagen, warum Sie bekommen würde einen 400-Reaktion.
httplib2
jetzt (wie geschrieben) ja hoffentlich nicht haben, um eine andere Methode für diese.