python: HTTP PUT avec non codée des données binaires
Je ne peux pas pour la vie de moi de comprendre comment effectuer une requête HTTP PUT avec des verbatim des données binaires dans Python 2.7 avec le standard de Python bibliothèques.
J'ai pensé que je pouvais le faire avec urllib2, mais qui ne parce que urllib2.Demande
attend de ses données dans application/x-www-form-urlencoded
format. Je ne veux pas coder les données binaires, j'ai juste envie de le transmettre dans son intégralité, après les en-têtes qui incluent
Content-Type: application/octet-stream
Content-Length: (whatever my binary data length is)
Cela semble si simple, mais je continue à tourner en rond et n'arrive pas à comprendre comment.
Comment puis-je faire cela? (à part ouvrir un raw socket binaire et écrire)
OriginalL'auteur Jason S | 2012-01-02
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé mon problème. Il semble qu'il y ait quelque obscure comportement dans
urllib2.Demande
/urllib2.urlopen()
(au moins en Python 2.7)La
urllib2.Request(url, data, headers)
constructeur semble attendre le même type de chaîne de caractères dans l'url et les paramètres de données.Je donnais le paramètre de données les données brutes à partir d'un fichier
read()
l'appel (qui en Python 2.7, il revient sous la forme d'un "simple" de la chaîne), mais mon url a été accidentellement Unicode parce que j'ai concaténé une partie de l'URL à partir du résultat d'une autre fonction qui retourne des chaînes Unicode.Plutôt que d'essayer de "abattu"
url
Unicode -> plaine des chaînes, il a essayé de "sortie" de ladata
paramètre en Unicode, et il m'a donné un codec erreur. (curieusement, ce qui se passe sur leurllib2.urlopen()
appel de la fonction, pas leurllib2.Request
constructeur)Quand j'ai changé mon appel à la fonction
il a bien fonctionné.
J'ai eu exactement ce problème, génial, vive l'homme!
OriginalL'auteur Jason S
Vous êtes à la lecture de la documentation:
urllib2.Demande
s'attend à ce que les données déjà codé, et pour le POST qui signifie généralement laapplication/x-www-form-urlencoded
format. Vous êtes libres de s'associer à toute autre, binaire de données, comme ceci:Ceci va produire la demande que vous voulez:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
btw, comment avez-vous la demande brute envoyés à partir de urllib2?
C'est parce que vos données est un string (un
unicode
objet), pas unbytes
objet. Coder à l'encodage correct avecencode
. Il peut être utile d'écrire un programme en Python 3, puis créer un backport pour 2.x.Désolé, je ne comprends pas votre question. Le code que j'ai utilisé est juste là, dans la réponse. Avis de la
b
en face deb'binary-data'
, ce qui en fait unbytes
littérale (même si cela n'a pas d'effet dans les 2.x). Pouvez-vous poster le code qui lance laUnicodeDecodeError
?Je vais essayer de poster un cas de test. Pour le rendu, je suis pas erreur de lecture de la documentation. Je comprends que sur le urllib2.Demande; cela est clair dans mon autre question. Ma question est de savoir comment l'utiliser aucun bibliothèques Python pour
PUT
non codée des données binaires.OriginalL'auteur phihag
Avez-vous envisagé/essayé d'utiliser httplib?
HTTPConnection.demande(méthode, url[, corps [en-têtes]])
Hmmm... d'ouvrir le fichier d'objet, bien que peut-être vous aider.
Ok, il suffit de checkin
Je n'ai pas essayé, donc je ne peux pas dire que ça sera mieux.
OriginalL'auteur Adam Wagner
Ce ciselée travaillé pour moi de METTRE une image:
sur site en HTTPS. Si vous n'avez pas besoin de HTTPS, utilisez
httplib.HTTPConnection(URL) à la place.
OriginalL'auteur serg_sh