2010-05-11 8 views
36

Sto costruendo una "API API", è fondamentalmente un wrapper per un servizio web REST interno che l'app web farà molte richieste. Alcune chiamate al servizio web devono essere GET anziché postare, ma passare parametri.Python e urllib2: come effettuare una richiesta GET con i parametri

Esiste un modo "best practice" per codificare un dizionario in una stringa di query? ad esempio: ?foo=bar&bla=blah

sto guardando il urllib2 docs, e sembra che decide da sola se utilizzare GET o POST in base a se si passa params o no, ma forse qualcuno sa come farlo trasformare il dizionario params in una richiesta GET.

Forse c'è un pacchetto per qualcosa di simile là fuori? Sarebbe bello se supportasse keep-alive, dal momento che il server web richiederà costantemente cose dal servizio REST.

Idealmente qualcosa che trasformerebbe anche l'XML in una sorta di oggetto python traversabile.

Grazie!

risposta

18

urllib.urlencode

E sì, la divisione urllib/urllib2 del lavoro è un po 'di confusione in Python 2.x.

+0

Sì, lo è .. avete qualche suggerimento su cosa usare per l'analisi XML? Sembra esserci una varietà di pacchetti integrati per xml, non sono sicuro quale sia più appropriato. Vince leggero in questo caso. Thx – adamJLev

+1

Ho sempre usato BeautifulStoneSoup per analizzare l'XML perché funziona (una volta che si apprende il modello). http://www.crummy.com/software/BeautifulSoup/ – msw

+4

C'è il minidom, ma dalla mia esperienza limitata posso dire che lxml è un modo per andare –

31

Is urllib.urlencode() non è sufficiente?

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

EDIT:

È possibile anche aggiornare l'URL esistente:

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

Nota che parse_qs funzione era in cgi pacchetto prima Python 2.6

EDIT 23/04/2012 :

Si può anche dare un'occhiata al python-requests - dovrebbe uccidere urllibs alla fine :)

+0

Speravo che ci fosse qualcosa di intelligente e che sapesse come aggiungere variabili a un URL con già alcuni parametri di stringa di query. per esempio. dato un url come 'example.com? foo = bar', se fai lo string che ti segue, devi preoccuparti di non duplicare il punto interrogativo e tutto il resto. Ma suppongo che questo sia lasciato come un esercizio allo sviluppatore – adamJLev

+0

Non necessariamente, dai un'occhiata al mio post aggiornato –

+1

+1 per la modifica, richieste> 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 

le url_values ​​è un valori codificati e può essere utilizzato per inviare al server con URL, una stringa di query (URL + "? "+ url_values).

+0

Dovresti provare a spiegare come questa è una risposta. Se questo fornisce veramente una risposta alla domanda, come fa questo? –

Problemi correlati