Urlencode массив значений
Я пытаюсь urlencode словарь в python с urllib.urlencode. Проблема в том, что я должен закодировать массив.
Результат должен быть:
criterias%5B%5D=member&criterias%5B%5D=issue
#unquoted: criterias[]=member&criterias[]=issue
Но я получаю результат:
criterias=%5B%27member%27%2C+%27issue%27%5D
#unquoted: criterias=['member',+'issue']
Я пробовал несколько вещей, но я не могу получить правильный результат.
import urllib
criterias = ['member', 'issue']
params = {
'criterias[]': criterias,
}
print urllib.urlencode(params)
Если я использую cgi.parse_qs
для декодирования правильной строки запроса, я получаю это как результат:
{'criterias[]': ['member', 'issue']}
Но если я кодирую этот результат, я получаю неправильный результат. Есть ли способ получить ожидаемый результат?
Ответы
Ответ 1
Решение намного проще, чем те, которые перечислены выше.
>>> import urllib
>>> params = {'criterias[]': ['member', 'issue']}
>>>
>>> print urllib.urlencode(params, True)
criterias%5B%5D=member&criterias%5B%5D=issue
Обратите внимание на True. См. http://docs.python.org/library/urllib.html#urllib.urlencode переменную доза.
В качестве побочной заметки вам не понадобится [], чтобы она работала как массив (именно поэтому urllib не включает ее). Это означает, что вам не нужно добавлять [] ко всем клавишам массива.
Ответ 2
Вы можете использовать список пар ключ-значение (кортежи):
>>> urllib.urlencode([('criterias[]', 'member'), ('criterias[]', 'issue')])
'criterias%5B%5D=member&criterias%5B%5D=issue'
Ответ 3
Listcomp значений:
>>> criterias = ['member', 'issue']
>>> urllib.urlencode([('criterias[]', i) for i in criterias])
'criterias%5B%5D=member&criterias%5B%5D=issue'
>>>
Ответ 4
Чтобы абстрагировать это для работы с любым словарем параметров и преобразовать его в список кортежей:
import urllib
def url_encode_params(params={}):
if not isinstance(params, dict):
raise Exception("You must pass in a dictionary!")
params_list = []
for k,v in params.items():
if isinstance(v, list): params_list.extend([(k, x) for x in v])
else: params_list.append((k, v))
return urllib.urlencode(params_list)
Что теперь должно работать как для приведенного выше примера, так и для словаря с некоторыми строками и некоторыми массивами как значения:
criterias = ['member', 'issue']
params = {
'criterias[]': criterias,
}
url_encode_params(params)
>>'criterias%5B%5D=member&criterias%5B%5D=issue'
Ответ 5
как aws api определяет свой get url: params.0=foo¶ms.1=bar
однако недостатком является то, что вам нужно написать код для кодирования и декодирования самостоятельно, в результате: params = [foo, bar]