2010-11-15 4 views
1

Je tente d'envoyer des données POST en utilisant urllib, mais le problème est normalement que vous urlencode votre dictionnaire de champs, puis vous envoyez cela avec votre demande. Mais certains de mes champs que je dois envoyer au serveur s'appellent exactement le même nom, ainsi en utilisant un dictionnaire je finis par supprimer beaucoup de mes données du dictionnaire parce que vous ne pouvez pas avoir deux clés avec le même nom et différentes données.Python urllib2 envoi de données POST

J'ai mes données de demande dans un format de chaîne dans la syntaxe correcte (par exemple. Var = valeur & var = valeur2 & ...) et je tente d'envoyer ce ainsi que ma demande urllib, mais je reçois une mauvaise demande à chaque fois. Existe-t-il un autre moyen d'urlencoder les données avant de les envoyer afin que je n'obtienne pas un 400?

+0

Etes-vous sûr que le 400 est dû au format de données POST et pas autre chose (par exemple, l'en-tête de l'agent utilisateur)? – SimonJ

Répondre

6

urllib.urlencode() peut prendre une liste de tuples, ce qui vous permet de spécifier plusieurs valeurs pour un paramètre:

>>> urlencode([("var", "value"), ("var", "value2")]) 
'var=value&var=value2' 

Ou utilisez une carte avec des listes comme valeurs:

>>> p = {"var": ["value", "value2"], "var2": ["yetanothervalue"]} 
>>> urlencode([(k, v) for k, vs in p.items() for v in vs]) 
'var=value&var=value2&var2=yetanothervalue' 

Vous pouvez même permettre à des listes ou les chaînes comme valeurs, bien que cela devienne moins concis:

>>> p = {"var": ["value", "value2"], "var2": "yetanothervalue"} 
>>> urlencode([(k, v) for k, vs in p.items() 
...  for v in isinstance(vs, list) and vs or [vs]]) 
'var=value&var=value2&var2=yetanothervalue'