本番環境に対応したコードを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する方法はありますか?
明示的にエンコードする必要はなく、単にdictを渡すだけです。
>>> r = requests.post(URL, data = {'key':'value'})
ドキュメント: から
通常、HTMLフォームのように、フォームにエンコードされたデータを送信する必要があります。これを行うには、辞書をデータ引数に渡すだけです。データのディクショナリは、リクエストが行われると自動的にフォームエンコードされます
をセットする Content-Type
ヘッダーからapplication/x-www-form-urlencoded
。
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post(URL, data=params, headers=headers)
注意すべき重要な点は、ネストされた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)