web-dev-qa-db-ja.com

urlencodedパラメータをPOSTリクエストでpython

本番環境に対応したコードをHerokuにデプロイしてテストしようとしています。残念ながら、JSONデータを取得していないため、x-www-form-urlencodedに変換しました。

params = urllib.parse.quote_plus(json.dumps({
    'grant_type': 'X',
    'username': 'Y',
    'password': 'Z'
}))
r = requests.post(URL, data=params)
print(params)

私が推測するように、この行にエラーが表示されていますdata=paramsが適切な形式ではありません。

APIへのurlencodedパラメータをPOSTする方法はありますか?

5
Abhinav Anand

明示的にエンコードする必要はなく、単にdictを渡すだけです。

>>> r = requests.post(URL, data = {'key':'value'})

ドキュメント: から

通常、HTMLフォームのように、フォームにエンコードされたデータを送信する必要があります。これを行うには、辞書をデータ引数に渡すだけです。データのディクショナリは、リクエストが行われると自動的にフォームエンコードされます

7

をセットする Content-Typeヘッダーからapplication/x-www-form-urlencoded

headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post(URL, data=params, headers=headers)
1
Rainbow Fossil

注意すべき重要な点は、ネストされたjsonデータの場合、ネストされたjsonオブジェクトを文字列に変換する必要があるということです。

data = { 'key1': 'value',
         'key2': {
                'nested_key1': 'nested_value1',
                'nested_key2': 123
         }

       }

辞書はこの形式に変換する必要があります

inner_dictionary = {
                'nested_key1': 'nested_value1',
                'nested_key2': 123
         }


data = { 'key1': 'value',
         'key2': json.dumps(inner_dictionary)

       }

r = requests.post(URL, data = data)
0
Vallie