2015-05-28 3 views
2

Я пытаюсь отправить json в качестве параметра через метод get для api, я обнаружил, что URL-адрес, на который он нажимает, немного отличается от исходного URL-адреса. Некоторый текст «:% 20» вставлен между URL-адресом. Не знаю, почему эта разница приходит, может кто-то помочьPython просит модуль url encode

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 

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 
+0

Пространства в данных JSON прекрасны и не влияют на декодирование; почему вы думаете, что это проблема? –

+0

Можно сравнить оригинал и мой url? они разные, я хочу, чтобы тот же самый url, что и оригинальный. – min2bro

ответ

5

Пространства являются не проблема; ваш метод генерации строки запроса равен, а также ваша фактическая полезная нагрузка JSON.

Обратите внимание, что исходный URL имеет другую структуру JSON:

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

Параметр 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 

Демо:

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

Вы все еще можете устранить пробелы, используемые в выводе JSON из json.dumps(), установив separators аргумент (',', ':'):

>>> json.dumps(json_data) 
'{"rajNames": ["WAR"]}' 
>>> json.dumps(json_data, separators=(',', ':')) 
'{"rajNames":["WAR"]}' 

, но я сомневаюсь, что это действительно необходимо.

Смежные вопросы