我正在使用请求lib和python 2.7 这样做时:
import requests
uri_params = {
u'email': u'myEmail@domain.com',
u'id_user': 15,
u'user_var': {
u'var1': u'val1',
u'var2': u'val2',
}
}
r = requests.get('http://google.com/', params=uri_params)
print r.url
它给了我一个结果: http://www.google.com/?id_user=15&email=myEmail%40domain.com&user_var=var1&user_var=var2
而不是 http://www.google.com/?id_user=15&email=myEmail%40domain.com&user_var%5Bvar1%5D=val1&user_var%5Bvar2%5D=val2 (= user_var [var1] = val1& user_var [var2] = val2)您是否知道请求lib是否作为处理此问题的方法?
编辑: 我花了几分钟时间了解如何使用Martijn Pieters的代码。 所以这里是像我一样对其他新手来说的最终代码:
import requests
import urllib
def nested_object(name, mapping):
return [(u'{}[{}]'.format(name, key), value) for key, value in mapping.iteritems()]
uri_params = [
(u'email', u'myEmail@domain.com'),
(u'id_user', 15),
]
uri_params.extend(nested_object(u'user_var', {u'var1': u'val1', u'var2': u'val2'}))
encoded = urllib.urlencode(uri_params)
r = requests.get('http://google.com/', params=encoded)
print r.url
答案 0 :(得分:2)
不,requests
lib没有办法处理它。
用于GET和POST请求的application/x-www-form-urlencoded
编码标准仅允许一个级别的键值对,并且嵌套值没有标准。相反,各种框架都发明了自己来处理这个问题。您正在查看众多变体之一。
您看到的输出是由urllib.urlencode()
函数创建的,该函数通过多次重复键来处理序列;您的嵌套字典被视为一个序列,因此只有键被序列化。通常,这将用于列表的值,并模仿浏览器在序列化具有相同名称的多个表单字段时将执行的操作。
您必须自己编码嵌套字典:
def nested_object(name, mapping):
return [(u'{}[{}]'.format(name, key), value) for key, value in mapping.iteritems()]
将返回一系列键值元组。将其余的URL参数保持为相同的格式:
uri_params = [
(u'email', u'myEmail@domain.com'),
(u'id_user', 15),
]
uri_params.extend(nested_object(u'user_var', {u'var1': u'val1', u'var2': u'val2'}))