2010-05-11 10 views
36

Estoy construyendo una "API API", básicamente es un contenedor para un servicio web REST interno que la aplicación web hará un montón de solicitudes. Algunas de las llamadas al servicio web deben ser GET en lugar de publicarlas, pero deben pasar parámetros.Python y urllib2: cómo hacer una solicitud GET con los parámetros

¿Existe una forma de "mejores prácticas" para codificar un diccionario en una cadena de consulta? por ejemplo: ?foo=bar&bla=blah

Estoy viendo el urllib2 docs, y parece que decide por sí mismo si usar POST o GET en función de si pasa los parámetros o no, pero tal vez alguien sepa cómo transformar el diccionario de parámetros en una solicitud GET.

¿Tal vez hay un paquete para algo como esto por ahí? Sería genial si admitiera keep-alive, ya que el servidor web solicitará constantemente cosas del servicio REST.

Idealmente, algo que también transformaría el XML en un tipo de objeto python transitable.

Gracias!

Respuesta

18

urllib.urlencode

Y sí, la división urllib/urllib2 del trabajo es un poco confuso en Python 2.x

+0

Sí, es ... ¿tiene alguna sugerencia sobre qué usar para el análisis de XML? Parece que hay una variedad de paquetes integrados para xml, no estoy seguro de cuál es el más apropiado. Ligero gana en este caso. Thx – adamJLev

+1

Solo he usado BeautifulStoneSoup para analizar XML porque simplemente funciona (una vez que aprende el modelo). http://www.crummy.com/software/BeautifulSoup/ – msw

+4

Hay minidom, pero por mi limitada experiencia puedo decir que lxml es una manera de ir –

31

¿No es suficiente urllib.urlencode()?

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

EDIT:

También puede actualizar la URL existente:

>>> 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' 

Tenga en cuenta que la función parse_qs estaba en cgi paquete antes de Python 2.6

EDITAR 23/04/2012 :

También puede echar un vistazo a python-requests - que debe matar a urllibs finalmente :)

+0

. Tenía la esperanza de que hubiera algo inteligente y que sepa cómo agregar variables a una URL con algunos parámetros de cadena de consulta. p.ej. dado una url como 'example.com? foo = bar', si haces la cadena que se agrega a ti mismo, tienes que preocuparte por no duplicar el signo de interrogación y todo eso. Pero supongo que eso lo dejó como un ejercicio para el desarrollador – adamJLev

+0

No necesariamente, eche un vistazo a mi publicación actualizada –

+1

+1 para editar, solicitudes> urllib – Mark

1
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 

los url_values ​​es un valores codificados y se puede utilizar para enviar al servidor junto con la URL como una cadena de consulta (url + "? "+ url_values).

+0

Debería tratar de explicar cómo esta es una respuesta. Si esto realmente proporciona una respuesta a la pregunta, ¿cómo lo hace?¿Qué hizo aquí para que esto sea válido y resolver el problema? –

Cuestiones relacionadas