Python и urllib2: как сделать GET-запрос с параметрами - PullRequest
41 голосов
/ 12 мая 2010

Я создаю «API API», это в основном оболочка для собственного веб-сервиса REST, к которому веб-приложение будет отправлять множество запросов. Некоторые вызовы веб-службы должны быть GET, а не отправлять, но передавать параметры.

Есть ли лучший метод кодирования словаря в строку запроса? например: ?foo=bar&bla=blah

Я смотрю на urllib2 docs , и похоже, что он сам решает использовать POST или GET, основываясь на том, передаете ли вы params или нет, но, возможно, кто-то знает, как заставить его преобразовать словарь параметров в запрос GET.

Может быть, есть пакет для чего-то подобного? Было бы замечательно, если бы он поддерживал keep-alive, поскольку веб-сервер будет постоянно запрашивать информацию у службы REST.

В идеале что-то, что также преобразовало бы XML в некий проходимый объект python.

Спасибо!

Ответы [ 3 ]

33 голосов
/ 12 мая 2010

Не достаточно urllib.urlencode () ?

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

EDIT:

Вы также можете обновить существующий URL:

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

Обратите внимание, что функция parse_qs была в пакете cgi до Python 2.6

ИЗМЕНИТЬ 23/04/2012:

Вы также можете взглянуть на python-запросов - это должно в конечном итоге убить urllibs:)

18 голосов
/ 12 мая 2010

urllib.urlencode

И да, разделение труда urllib / urllib2 немного запутанно в Python 2.x.

1 голос
/ 16 апреля 2015
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

url_values является закодированным значением и может использоваться для отправки на сервер вместе с URL-адресом в качестве запроса string(url+"?"+url_values).

...