Преобразовать словарь Python (2.7) в действительные параметры запроса - PullRequest
0 голосов
/ 13 июня 2018

Так что я пока что немного осмотрелся и нашел хиты, но ничего такого, что вполне соответствовало бы этому стандарту IMO.То, что я хочу сделать, - это взять Python dict под названием «result» (обратите внимание, что «keyword_scores» представляет собой список dicts внутри внутри «data» dict.):

>>> print result
>>> {   
        u'data': {   
            u'clean_table': u'true',
            u'keyword_scores': [   
                {   
                    u'keyword': u'edited for easy reading on SO',
                    u'score': 0.4054651081081644
                }
            ],
            u'user_id': u'2'
        }
    }

и, впо крайней мере, я думаю, используйте некоторую комбинацию

urllib.urlencode()

и

urlparse.parse_qs()

, чтобы иметь возможность объединить как 'query_string' в URL для использования внутри:

urllib2.Request(host_domain + some_post_data_endpoint + query_string)

Я предлагаю только эти библиотеки, так как это то, что я думаю, мне нужно использовать, основываясь на моем поиске, но я широко открыт с подходами и инструментами, которые можно использовать здесь.Проблема, с которой я сталкиваюсь, заключается в том, что по какой-то причине мне кажется, что мне нужно выполнить urlencode () перед вызовом parse_qs (), но в других предложениях говорится, что мне нужно сначала вызвать parse_qs () перед кодированием.Не похоже, что есть простой способ конвертировать словарь, который не является полностью «плоским», в параметры запроса для использования urllib2.Request ().

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Чтобы решить эту проблему, я использовал Postman, чтобы узнать, как он кодирует URL, а также переключился на использование библиотеки запросов вместо urllib2 / urllib.

Что-то вроде:

raw_json = json.dumps(result)
encoded_json = urllib.quote(raw_json)
tmp = Template("data=$d")
# request will look like encoded nonsense like "data=%7B%22clean_table%22%3A%20true%2C%20%22keyword_scores%22%3A%20%5B%7B%22score%22%3A%200.4054651081081644%2C%20%22keyword%22%3A%20%22bruins%22%7D%5D%2C%20%22user_id%22%3A%20%222%22%7D"
request = tmp.substitute(d=encoded_json)
headers = {
    'Content-Type': "application/x-www-form-urlencoded"
}
response = requests.request("POST", url, data=request, headers=headers)

ПРИМЕЧАНИЕ. Требуется параметр headers.

0 голосов
/ 13 июня 2018

Я предполагаю, что у вас есть конечная точка, на которую вы хотите отправить данные.Затем вы можете просто сделать следующее и декодировать URL в конечной точке:

import urllib
result = {u'data': {u'clean_table': u'true',u'keyword_scores': [{u'keyword': u'edited for easy reading on SO', u'score': 0.4054651081081644}],u'user_id': u'2'}}
result_string = urllib.urlencode(result)
urllib2.Request(host_domain + some_post_data_endpoint + "?result=" + result_string)

Например, если ваша конечная точка - JS, вы можете просто сделать следующее, чтобы получить результат в том же словаре:

var url = new URL(window.location.href);
var result = JSON.parse(url.searchParams.get("result"));
...