web-dev-qa-db-fra.com

Python et urllib2: comment faire une requête GET avec des paramètres

Je suis en train de construire une "API API", c'est essentiellement un wrapper pour un service Web interne REST auquel l'application Web fera beaucoup de demandes. Certains appels de service Web nécessitent être GET plutôt que poster, mais en passant des paramètres.

Existe-t-il une méthode de "meilleure pratique" pour coder un dictionnaire dans une chaîne de requête? par exemple.: ?foo=bar&bla=blah

Je regarde les rllib2 docs , et il semble qu'il décide par lui-même d'utiliser POST ou GET en fonction de si vous passez des paramètres ou non, mais peut-être quelqu'un sait comment transformer le dictionnaire params en une requête GET.

Peut-être qu'il existe un package pour quelque chose comme ça là-bas? Ce serait formidable s'il supportait keep-alive, car le serveur web demandera constamment des choses au service REST.

Idéalement, quelque chose qui transformerait également le XML en une sorte d'objet traversable python objet.

Merci!

41
adamJLev

rllib.urlencode

Et oui, le urllib/urllib2 la division du travail est un peu déroutante dans Python 2.x.

18
msw

rllib.urlencode () ne suffit-il pas?

>>> import urllib
>>> urllib.urlencode({'foo': 'bar', 'bla': 'blah'})
foo=bar&bla=blah

ÉDITER:

Vous pouvez également mettre à jour l'URL existante:

  >>> import urlparse, urlencode
  >>> url_dict = urlparse.parse_qs('a=b&c=d')
  >>> url_dict
  {'a': ['b'], 'c': ['d']}
  >>> url_dict['a'].append('x')
  >>> url_dict
  {'a': ['b', 'x'], 'c': ['d']}
  >>> urllib.urlencode(url_dict, True)
  'a=b&a=x&c=d'

Notez que parse_qs la fonction était dans le package cgi avant Python 2.6

EDIT 23/04/2012:

Vous pouvez également jeter un œil à python-requests - cela devrait finir par tuer les urllibs :)

33
import urllib
data = {}
data["val1"] = "VALUE1"
data["val2"] = "VALUE2"
data["val3"] = "VALUE3"
url_values = urllib.urlencode(data)
url = "https://www.python.org"
print url + "?" + url_values

Le url_values Est une valeur codée et peut être utilisé pour publier sur le serveur avec l'URL comme une requête string(url+"?"+url_values).

1
Vijay Chander