Ответ 1
И да, разделение труда urllib
/urllib2
немного запутано в Python 2.x.
Я создаю "API API", это в основном оболочка для домашнего веб-сервиса REST, к которому веб-приложение будет делать много запросов. Некоторые вызовы веб-сервисов должны быть GET, а не post, но передавать параметры.
Существует ли "лучший способ" кодирования словаря в строку запроса? например: ?foo=bar&bla=blah
Я смотрю urllib2 docs, и похоже, что он сам решает использовать POST или GET на основе, если вы пройдете params или нет, но, возможно, кто-то знает, как заставить его преобразовать словарь params в запрос GET.
Может быть, есть пакет для чего-то подобного? Было бы здорово, если бы он поддерживал keep-alive, так как веб-сервер будет постоянно запрашивать вещи у службы REST.
Идеально то, что также превратило бы XML в какой-то проходящий объект python.
Спасибо!
И да, разделение труда urllib
/urllib2
немного запутано в Python 2.x.
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
EDIT 23/04/2012:
Вы также можете взглянуть на python-requests - в конце концов он должен убить urllibs:)
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)
запроса string(url+"?"+url_values)
.