Python请求模块url编码

min*_*bro 4 python python-requests

我试图通过一个api的get方法发送json作为参数,我发现它所击中的url与原始url略有不同.在URL之间插入一些":%20"文本.不知道为什么会出现这种差异,有人可以提供帮助

Original URL: http://258.198.39.215:8280/areas/0.1/get/raj/name?jsonRequest=%7B%22rajNames%22%3A%5B%22WAR%22%5D%7D

My URL : http://258.198.39.215:8280/areas/0.1/get/raj/name?jsonRequest=&%7B%22rajNames%22:%20%22WAR%22%7D
Run Code Online (Sandbox Code Playgroud)

Python代码:

headers = {'Accept': 'application/json','Authorization': 'Bearer '+access_token}
json = {'rajNames':'WAR'}
url = 'http://258.198.39.215:8280/areas/0.1/get/raj/name?jsonRequest='
r = requests.get(url, params=json.dumps(json),headers=headers)
print _r.url
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 9

空间不是问题; 您生成查询字符串的方法,因为是你的实际JSON的有效载荷.

请注意,您的原始URL具有不同的 JSON结构:

>>> from urllib import unquote
>>> unquote('%7B%22rajNames%22%3A%5B%22WAR%22%5D%7D')
'{"rajNames":["WAR"]}'
Run Code Online (Sandbox Code Playgroud)

rajNames参数是一个列表,而不是一个字符串.

接下来,requests将所有数据params视为参数,因此它用于&从上一个参数中分隔.使用字典并将?jsonRequest=零件保留requests以生成:

headers = {'Accept': 'application/json', 'Authorization': 'Bearer '+access_token}
json_data = {'rajNames': ['WAR']}
params = {'jsonRequest': json.dumps(json_data)}
url = 'http://258.198.39.215:8280/areas/0.1/get/raj/name'
r = requests.get(url, params=params, headers=headers)
print _r.url
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import requests
>>> import json
>>> headers = {'Accept': 'application/json', 'Authorization': 'Bearer <access_token>'}
>>> json_data = {'rajNames': ['WAR']}
>>> params = {'jsonRequest': json.dumps(json_data)}
>>> url = 'http://258.198.39.215:8280/areas/0.1/get/raj/name'
>>> requests.Request('GET', url, params=params, headers=headers).prepare().url
'http://258.198.39.215:8280/areas/0.1/get/raj/name?jsonRequest=%7B%22rajNames%22%3A+%5B%22WAR%22%5D%7D'
Run Code Online (Sandbox Code Playgroud)

您仍然可以json.dumps()通过将separators参数设置为(',', ':'):来消除JSON输出中使用的空格:

>>> json.dumps(json_data)
'{"rajNames": ["WAR"]}'
>>> json.dumps(json_data, separators=(',', ':'))
'{"rajNames":["WAR"]}'
Run Code Online (Sandbox Code Playgroud)

但我怀疑这是真的需要.